私はジャージー (2.14) アプリケーションを持っていますが、これは問題なく動作します。そこでいくつかのサービスを実行しています。ここで、キャッチされなかった例外を傍受してログに記録するか、どこかにメールで送信するように、ServletContainer を構成したいと思います。
ApplicationEventListener の実装と、例外を生成するためのテスト エンドポイントが既にあります。
これは、例外を生成するメソッドです (これは機能しています :-) :
@GET
@Path(TEST_EXCEPTION)
public String testException(@Context final ServletContext context) {
String s = null;
int size = 0;
if (System.nanoTime() % 10 != 0) {
s = null;
} else {
s = "No exception will occur";
}
size = s.length();
return Integer.toString(size) + ":" + s;
}
そして、これは私の ApplicationEventListener の場合の実装です:
public class MyApplicationEventListener implements ApplicationEventListener {
private transient volatile int count = 0;
private int exceptions = 0;
@Override
public void onEvent(final ApplicationEvent applicationEvent) {
ApplicationEvent.Type type = applicationEvent.getType();
}
@Override
public RequestEventListener onRequest(final RequestEvent requestEvent) {
RequestEvent.Type type = requestEvent.getType();
if (type == RequestEvent.Type.ON_EXCEPTION) {
exceptions++;
}
count++;
return null;
}
}
そして、これは私のweb.xmlの設定です:
<servlet>
<servlet-name>jersey-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....rest</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>
com....filter.MyApplicationEventListener
</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.tracing</param-name>
<param-value>ALL</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
onEvent() と onRequest() の両方が呼び出されていますが、例外が発生すると、ON_EXCEPTION ではなく START が発生します。
私は何を間違っていますか?または、Jersey サービスのメソッドに起因するすべての例外を取得するにはどうすればよいですか?
Spring の HandlerExceptionResolver のようなものを持っている/作りたいです。