Jersey で見えない例外をログに流す


はじめに

Jersey で内部エラーが起こると,ステータス 500 でエラーメッセージとともにレスポンスが返ってきますよね.ところが,ときどき困ったことに,

  • レスポンスに詳細なエラーメッセージがない!
  • サーバログにも何も情報が出ていない!

みたいな挙動で 500 が返ってくることがあり,どう対処しようか困ることがあります(筆者自身も困った).

こんなときの対処法として,Jersey で発生した例外を拾ってログに情報を流してあげる方法を紹介します.

コード

イベントリスナを設置して,リクエスト/レスポンス処理中に発生した例外の情報をログに出力するようにします.

具体的には,以下のような MyApplicationEventListenerMyRequestEventListener を用意し,このうち MyApplicationEventListener をアプリケーションに登録します.

import org.glassfish.jersey.server.monitoring.ApplicationEvent;
import org.glassfish.jersey.server.monitoring.ApplicationEventListener;
import org.glassfish.jersey.server.monitoring.RequestEvent;
import org.glassfish.jersey.server.monitoring.RequestEventListener;

public class MyApplicationEventListener implements ApplicationEventListener {

    @Override
    public void onEvent(ApplicationEvent event) {
    }

    @Override
    public RequestEventListener onRequest(RequestEvent event) {
        return new MyRequestEventListener();
    }
}
import java.util.logging.Logger;

import org.glassfish.jersey.server.monitoring.RequestEvent;
import org.glassfish.jersey.server.monitoring.RequestEventListener;

public class MyRequestEventListener implements RequestEventListener {

    private static final Logger LOGGER = Logger.getLogger(MyRequestEventListener.class.getName());

    @Override
    public void onEvent(RequestEvent event) {
        switch (event.getType()) {
        case ON_EXCEPTION:
            LOGGER.severe(event.getException().toString());
        }
    }
}

これで,発生した例外の情報とスタックトレースがログに出るはず.

参考資料