2017-09-07 8 views
1

REST @Controllerを介して共有するグローバル例外ハンドラがあります。このために私は、@ExceptionHandlerの方法で@ControllerAdviceを使用します。これは正常に動作します。ここで、特定のRestコントローラに@ExceptionHandlerを追加すると、その新しいハンドラがグローバル例外ハンドラよりも優先され、グローバルハンドラが呼び出されることはありません。Spring @Controller例外ハンドラとグローバル例外ハンドラ。両方を呼び出す方法

私が実際に必要としているのはです。両方ともと呼ばれています。順序は関係ありません。要点は、コントローラに依存しないグローバルなエラー処理コードがいくつか存在し、コントローラ固有のエラー処理もいくつかあり、両方を実行する必要があるということです。これは可能ですか?例えば何らかの形でコントローラー固有のハンドラー(最初に呼び出される)は、例外処理を処理されていないとマークして、次のハンドラーが呼び出されるようにすることはできますか?

が、私は自分自身を@Controller@ControllerAdviceを注入し、具体的なものからグローバルハンドラを呼び出すことができます知っているが、私はむしろグローバルな例外ハンドラから切り離さコントローラを保つ

答えて

1

私はあなたがこれを行うことができるとは思いませんすぐに使用可能なスプリングを使用してください。あなたはまた、getExceptionHandlerMethodメソッドの実装を見ることができ

... 
    ServletInvocableHandlerMethod exceptionHandlerMethod = getExceptionHandlerMethod(handlerMethod, exception); 
    if (exceptionHandlerMethod == null) { 
     return null; 
    } 
    ... 

:あなたはこの方法ExceptionHandlerExceptionResolver#doResolveHandlerMethodExceptionでボンネットの下に見ている場合は、発生した例外を処理する単一方法を探して最初の春にそれを見ることができます。最初に、コントローラー・メソッド内に適切なハンドラーを見つけようとしましたが、何も見つからない場合はコントローラー・アドバイザー内にあります。

した後、それを呼び出すこと:

try { 
     if (logger.isDebugEnabled()) { 
      logger.debug("Invoking @ExceptionHandler method: " + exceptionHandlerMethod); 
     } 
     exceptionHandlerMethod.invokeAndHandle(webRequest, mavContainer, exception, handlerMethod); 
    } 
    catch (Exception invocationEx) { 
     if (logger.isErrorEnabled()) { 
      logger.error("Failed to invoke @ExceptionHandler method: " + exceptionHandlerMethod, invocationEx); 
     } 
     return null; 
    } 

また、あなたはもあなたの最初のハンドラまたは再スロー元から新しい例外をスローすることはできませんので、春には、オリジナルの例外処理中に発生する可能性のある例外を飲み込むことに注意すべきです例外なので、他の場所にキャッチすることができます(実際は可能ですが、これは無意味です)。

あなたが本当にこれをしたいのであれば、 - 私は唯一の方法は、あなたがExceptionHandlerExceptionResolverを所有している(多分スプリングスExceptionHandlerExceptionResolverを拡張)とdoResolveHandlerMethodException方法を変更書くことだと思いますので、乗算exceptionHandlerMethod(コントローラ内の1と顧問内の1を探します)、チェーン内で呼び出します。これは難しいかもしれません:)

また、this Jiraのチケットを見ることができます。

希望します。

関連する問題