そこで、私は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
何が欠けていますか?
私は展開にとらわれないアプリケーションモデルを使用しているので、以下がうまくいきました:
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;
}
}
サンプルの開発中に同じ問題が発生しましたREST API。REST APIの作成中に、org.manish.rest.messageのような基本パッケージ名を指定しました。このようなベースパッケージの下に他のすべてのパッケージを作成することになっています
org.manish.rest.message.model
org.manish.rest.message.database
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
に変更しました
その後、私は一度ポストマンで実行し、期待した結果を得ました。
これがクエリを解決できることを願っています。
ありがとうマニッシュ
私は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();
X extends ResourceConfigファイルに例外マッパークラスを登録してみてください。 register(CustomExceptionMapper.class);この行は、アプリケーションがマッパークラスを見つけ、マッパークラスのtoResponseメソッド内に書き込んだものを返すのに役立ちます
Springを使用してジャージーアプリを接続し、@ Componentを@Providerと併用しました。
ジャージーv> 2.5に移動すると、機能しなくなりました。
この問題を解決するには、@ Componentの代わりに@Singletonアノテーションを@Providerの横に次のように配置します。
@Provider
@Singleton
public class EntityExceptionMapper implements ExceptionMapper<EntityException> {...
同じ問題があり、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>
私は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);
私も同じ問題に直面しています。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アノテーションはこれを修正します
私も同じ問題を抱えていました。私は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>