0

私はジャージー (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 のようなものを持っている/作りたいです。

4

2 に答える 2

0

...例外が発生すると、ON_EXCEPTION ではなく START が発生します。

私は何を間違っていますか?

Jersey にリクエストのイベントの発生を続行するように指示するには、null を返すのではなく、START イベントから RequestEventListener のインスタンスを返す必要があります。

21.1.2から。イベントリスナー:

2 番目のメソッド onRequest は、新しいリクエストが受信されるたびに、Jersey ランタイムによって呼び出されます。メソッドに渡されるリクエスト イベント タイプは常に START です。新しいリクエストの他のリクエスト ライフサイクル イベントをリッスンする場合は、リクエストを処理する RequestEventListener のインスタンスを返す必要があります。

例外イベントをログに記録する例については、https://stackoverflow.com/a/33271754/5473824を参照してください。

于 2015-10-22T01:09:56.813 に答える