74022


現在SpringBootを使用していて、エラーハンドリングをControllerAdviceで行っています。  
また、filter(javax.servlet.Filter)を使用してControllerに入る前にライブラリの読み込みなどを行っています。

今回、このfilterの部分でRuntimeExceptionがキャッチされるとControllerAdviceがエラーハンドリングしてしまいクライアントに意図しないエラーレスポンスが返ってしまう挙動を発見しました。
(filter内のExceptionのキャッチはエラーログを出すだけで、スローやreturnなどは行いません。 つまり処理は継続されます。)  
私の理解ではControllerAdviceはController層に入った後で起きたエラーについてハンドリングされる認識で、filter内でのException(しかもスローしていない)のエラーがハンドリングされてしまうのが不可解です。

この現象が、私の実装に原因があるのか、それともSpring側やfilterなどの仕様の理解不足かなど分かりますか？

以下に実装を簡単にしたものを示します。

@Controller

[code]

    public void  control() throws MyException {
       log.debug(“start”);   <- ここまではきていない
     :
     :
    }
    
[/code]

@MyException

[code]

    @ResponseStatus(value = HttpStatus.FORBIDEN, reason=“test my exception”)
    Public class MyException extends RuntimeException {
        :
    }
    
[/code]

@ContollerAdvice

[code]

    @ControllerAdvice
    public class MyAdvice {
    
      @ExceptionHandler({MyException.class})
      public Object handleMyException(Exception e, WebRequest r) {
           :      
      return HttpStatus.FORBIDDEN          <- (このメソッドがハンドリングします)
      }
    }
    
[/code]

@filter

[code]

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException {
          :
         try {
              Object obj = ライブラリの読み込み. ← （今回これがRuntimeExceptionを投げてきます)
               :
          } catch (Exception e) {
              log.error(e.getMessage);
         }
    }
    
[/code]

※filter内で以下のようにエラーが起きる部分をtry節から抜くとControllerAdviceがハンドリングしないことがわかっています。

[code]

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc) throws IOException {
         Object obj = ライブラリでの処理. ← （今回これがRuntimeExceptionを投げてきます)
         Try {
               :
          } catch (Exception e) {
              log.error(e.getMessage);
         }
    }
    
[/code]


CC BY-SA 4.0
2021-02-14T04:24:20.557
73978
2021-02-15T14:51:13.483
2021-02-14T06:34:23.890
3060
37080
question
java spring
SpringBootの@ControllerAdviceの挙動について


今回の問題は結局サーブレットの中身までリクエストが届いており、そこでスローされていたのである意味期待通りでした。  
filter内でExceptionを補足しない場合、@ContorollerAdviceがハンドリングしないのも、結局フレームワーク側などで捕捉が漏れたExceptionをキャッチして再スローしている(そのためControllerには届いてないのでハンドリングされない)のだと考えています。


CC BY-SA 4.0
2021-02-15T14:51:13.483
74022
2021-02-15T14:51:13.483
37080
73978
answer