web-dev-qa-db-ja.com

ジャージーExceptionMapperのtoResponseが呼び出されない

そこで、私はWebアプリケーションを構築しています。JPAデータとJerseyを使用して、JSONデータを消費/生成しています。

カスタム「EntityException」とカスタム「EntityExceptionMapper」があります

これがマッパーです:

  @Provider
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {

    public EntityExceptionMapper() {
        System.out.println("Mapper created");
    }

    @Override
    public Response toResponse(EntityException e) {
        System.out.println("This doesnt print!");
        return Response.serverError().build();
    }
}

私の例外:

public class EntityException extends Exception implements Serializable{

  public EntityException(String message) {
      super(message);
      System.out.println("This prints...");
  }

}

そして、私はそれをREST呼び出しから呼び出しています:

@POST
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public String test() throws EntityException{
    throw new EntityException("This needs to be send as response!!");
    //return "test";
}

私の問題は、上記の例外がスローされると、コンストラクターに入るということです(prints: "This prints ...")Edit:また、 "Mapper created!"も取得します。

しかし、私の応答は空で、私はtoResponseメソッドからsysに到達しません。これは、ジャージのウェブサイトの例と非常によく似ています。

https://jersey.Java.net/nonav/documentation/1.12/jax-rs.html#d4e435

何が欠けていますか?

14
alex

私は展開にとらわれないアプリケーションモデルを使用しているので、以下がうまくいきました:

public class MyApplication extends Application {
    public Set<Class<?>> getClasses() {
        Set<Class<?>> s = new HashSet<Class<?>>();
        s.add(HelloWorldResource.class);

        /** you need to add ExceptionMapper class as well **/
        s.add(EntityExceptionMapper.class)
        return s;
    }
}
12
bluetech

サンプルの開発中に同じ問題が発生しましたREST API。REST APIの作成中に、org.manish.rest.messageのような基本パッケージ名を指定しました。このようなベースパッケージの下に他のすべてのパッケージを作成することになっています


  1. モデル-org.manish.rest.message.model
  2. データベース-org.manish.rest.message.database
  3. リソース-org.manish.rest.message.resource

web.xmlでinit paramはこのように与えられました

 <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>org.manish.rest.message</param-value>
 </init-param>

これは、web.xmlにベースパッケージを登録したことを意味します。私の呼び出しと要件に基づいてJAX-RSによって検討されます。しかし、誤って例外パッケージを作成したとき、パッケージ名にorg.manish.rest.exceptionを付けました。これはweb.xmlに登録されていないため、完全な例外クラスはJAX-RSによる例外の処理とは見なされませんでした。修正として、例外パッケージ名をorg.manish.rest.exceptionからorg.manish.rest.message.exceptionに変更しました

その後、私は一度ポストマンで実行し、期待した結果を得ました。

これがクエリを解決できることを願っています。

ありがとうマニッシュ

5
Kushwaha

私はExceptionMapperが適切な@Providerアノテーションと残りのコードはジャージーの例と同じですが、まだ適切に登録されていません。

まあ、私は自分のカスタムExceptionMapperを自分のHttpServlet内にメソッドaddExceptionMapperで手動で登録しなければならなかったことがわかりました。現在は手動で登録されているため、@Providerアノテーションは安全に削除できます。

したがって、次のExceptionMapperを使用します(RuntimeExceptionをすべてキャッチして400として再スローします)。

public class MyCustomExceptionHandler implements ExceptionMapper<RuntimeException> {

  @Override
  public Response toResponse(RuntimeException exception) {
    return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build();
  }
}

私は私のinitに2行目を追加する必要がありました:

HttpServlet serviceServlet = jerseyServletFactory.create(someResource);
jerseyServletFactory.addExceptionMapper(new MyCustomExceptionHandler()); //<--

httpServer.register(serviceServlet, "/api");
httpServer.start();
5

X extends ResourceConfigファイルに例外マッパークラスを登録してみてください。 register(CustomExceptionMapper.class);この行は、アプリケーションがマッパークラスを見つけ、マッパークラスのtoResponseメソッド内に書き込んだものを返すのに役立ちます

2
avinash

Springを使用してジャージーアプリを接続し、@ Componentを@Providerと併用しました。

ジャージーv> 2.5に移動すると、機能しなくなりました。

この問題を解決するには、@ Componentの代わりに@Singletonアノテーションを@Providerの横に次のように配置します。

@Provider
@Singleton
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {...
2
mSolujic

同じ問題があり、web.xmlファイルのjersey.config.server.provider.packagesにExceptionMapperのパッケージを含めることで修正できました。以下は、私のweb.xmlからの抜粋です。

<servlet>
    <servlet-name>voteride-servlet</servlet-name>
    <servlet-class>
        org.glassfish.jersey.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            com.voteride.ws;com.voteride.errorHandling;org.codehaus.jackson.jaxrs
        </param-value>
    </init-param>
    <init-param>
        <param-name>jersey.config.server.provider.scanning.recursive</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
2

私はJersey JdkHttpServerFactoryを使用しており、他のコントローラーリソースと同じように、ExceptionMapperクラスをリソースとして追加する必要がありました。

import com.Sun.net.httpserver.HttpServer;
import javax.ws.rs.core.UriBuilder;
import Java.net.URI;
import Java.util.HashSet;
import Java.util.Set;
import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;

// ...

Set<Class> resources = new HashSet<>();
// Add whatever other resource classes you have...

//--->>> Add the exception mapper <<<---
resources.add(EntityExceptionMapper.class);

ResourceConfig resources = new ResourceConfig(resources);
URI uri = UriBuilder.fromUri("http://localhost/").build();
HttpServer server = JdkHttpServerFactory.createHttpServer(uri, resources);
1
brianmearns

私も同じ問題に直面しています。ExceptionMappperHandlerクラスを持つパッケージ名を追加するだけです。

<web-app version="2.5" xmlns="http://Java.Sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>Service,Utilities.ExceptionMapper</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

ここで、serviceにはすべてのサービスクラスが含まれ、Utilities.ExceptionMapperにはすべてのexceptionMapperが含まれます。その助けを願っています

私はまだジャージ1.17を使用しています、春とジャージー春

@Componentアノテーションはこれを修正します

0
Kalpesh Soni

私も同じ問題を抱えていました。私はweb.xmlを変更する必要がありました。以前は、web.xmlファイルのparam-valueはcom.two95.restful.resourceルートパッケージに変更しましたcom.two95.restful。その後、@Providerアノテーション。

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.two95.restful</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
0
SM ANSARI