2017-12-12 8 views
0

私はSpringブートでJerseyを使用しています。私はResourceConfig.register(MyExceptionMapper.class)によって登録されたExceptionMapper<Throwable>を持っていて、@Providerと注釈されています。ExceptionMapper <Throwable> ForbiddenExceptionで呼び出されていません

私のコードがRuntimeExceptionを投げた場合MyExceptionMapper.toResponse()が呼び出されます。

私のアプリケーションがjavax.ws.rs.ForbiddenExceptionを投げた場合、私のExceptionMapperExceptionMapper<Throwable>であっても呼び出されません。

ジャージーにExceptionMapperのデフォルト値(WebApplicationException)が割り当てられているとします。これをどのようにカスタマイズできますか?

私が本当にやりたいことは、Throwableの場合にDEBUGロギングを追加することです(残りのコードは、WebApplicationException以外でうまく動作します)。これを行うより良い方法はありますか?

答えて

0

ので、2つの部分:

まず、ジャージーは私ExceptionMapperに当たっていない理由はそれだけで、それは内部的にマッピングをサポートしていない場合は、そうしようとしていることです。 ServerRuntime.Responderクラスは、WebApplicationExceptionのいずれかをマップしようとします。これが何らかの理由で成功しない場合に限り、例外はExceptionMapperに提供されます(少なくともこれは私が見た動作です)。

  • ServerRuntime.Responderのログレベルを設定します。

    第二に、ログを追加するカップルの方法があります。私にとっては、例外ではなくすべての応答を記録するので、これは広すぎます。これはここに記載されています:https://stackoverflow.com/a/41484564/905762

  • 私が行った解決策は、ContainerResponseFilterを追加してContainerRequestから例外を取得することでした。これは幾分ここに記載されている:https://stackoverflow.com/a/19680862/905762

    パブリッククラスExceptionsLoggingContainerResponseFilterはContainerResponseFilterを実装{ 民間最終静的ロガーロガー= LoggerFactory.getLogger(ExceptionsLoggingContainerResponseFilter.class)。

    @Override公共ボイドフィルタ(ContainerRequestContext要求、 ContainerResponseContext応答){ Throwableをスロー可能=((ContainerRequest)応答).getMappedThrowable(); if(throwable!= null){ LOGGER.info(buildErrorMessage(request)、throwable); } }

関連する問題