1. ホーム
  2. java

[解決済み] Springのフィルターでスローされる例外をどのように管理するか?

2022-04-25 17:36:56

質問

5xxエラーコードを管理する汎用的な方法を使いたいのですが、例えば、私のスプリングアプリケーション全体でデータベースがダウンしている場合を具体的に説明します。スタックトレースではなく、きれいなエラーJSONが欲しいです。

コントローラには @ControllerAdvice クラスがあり、これはリクエストの途中でデータベースが停止するケースもキャッチします。しかし、これだけではありません。私はまた、カスタム CorsFilter エクステンド OncePerRequestFilter を呼び出すと doFilter を取得します。 CannotGetJdbcConnectionException で管理されなくなります。 @ControllerAdvice . ネットでいろいろ読みましたが、さらに混乱するばかりです。

だから、いろいろと疑問があるんです。

  • カスタムフィルタを実装する必要がありますか?私は ExceptionTranslationFilter を処理しますが、これは AuthenticationException または AccessDeniedException .
  • 自分で実装しようと思ったのは HandlerExceptionResolver 管理するカスタム例外がないのですから、これよりもっと明白な方法があるはずです。また、try/catch を追加して HandlerExceptionResolver (しかし、これは応答で何も返さず、ステータス200と空のボディを得ます。

何か良い対処法はないでしょうか?ありがとうございます。

どのように解決するのですか?

というわけで、こんな感じです。

フィルターについての基本的なことを読みました ここで そして、フィルターチェーンの最初になるカスタムフィルターを作成し、そこで発生する可能性のあるすべての実行時例外をキャッチするためのトライキャッチを持つ必要があることを理解しました。それから、私は手動でjsonを作成し、それをレスポンスに置く必要があります。

これが私のカスタム・フィルターです。

public class ExceptionHandlerFilter extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (RuntimeException e) {

            // custom error response class used across my project
            ErrorResponse errorResponse = new ErrorResponse(e);

            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            response.getWriter().write(convertObjectToJson(errorResponse));
    }
}

    public String convertObjectToJson(Object object) throws JsonProcessingException {
        if (object == null) {
            return null;
        }
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(object);
    }
}

そして、web.xmlの中の CorsFilter . そして、それは動作します

<filter> 
    <filter-name>exceptionHandlerFilter</filter-name> 
    <filter-class>xx.xxxxxx.xxxxx.api.controllers.filters.ExceptionHandlerFilter</filter-class> 
</filter> 


<filter-mapping> 
    <filter-name>exceptionHandlerFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>CorsFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>