2017-08-11 8 views
0

@Exceptionハンドラを私のアプリケーションに使用しているとします。春@Exceptionハンドラの振る舞い

私が定義する場合:

@ControllerAdvice 
public class MyExceptionHandler { 

    @ExceptionHandler(value = Exception.class) 
    public boolean generic(Exception e) { 
     return e; 
    } 

    @ExceptionHandler(value =MyException.class) 
    public boolean myException(MyException e) { 
     return e; 
    } 
} 

イルを私のコントローラはジェネリック例外ハンドラは、例外の持つ最高の試合はここ(MyExceptionを実行されますあまりにのみトリガされます、MyExceptionをスローしますハンドラ)?

+1

これはあなたを助けることがあります。https://stackoverflow.com/questions/19498378/setting-precedence-of-multiple-controlleradvice-exceptionhandlers – Thoomas

+0

はい、ありがとうございました! 「例外が発生すると、ExceptionHandlerExceptionResolverはこれらのExceptionHandlerMethodResolverを反復処理し、例外を処理できる最初のものを使用します。私が必要としていたものと全く同じものでした。 – Akah

+0

必要に応じて '@ Order'で注文することができます。 – Thoomas

答えて

2

ないことが汎用的な例外Exception)を見つけるためにしようとする場合、ハンドラは、まず特定の例外MyExceptionハンドラを見つけようとします例外。

コントローラの場合、throwMyExceptionの場合、ハンドラはMyExceptionハンドラを呼び出します。

例外の引数:一般的な例外として宣言されているか、より具体的には と宣言されています。 注釈自体が {@link #value()}で例外タイプを絞り込んでいない場合、これはマッピングヒントとしても機能します。要求および/または応答オブジェクト(サーブレットAPI またはポートレットAPI)。

参照:https://github.com/spring-projects/spring-framework/blob/5f4d1a4628513ab34098fa3f92ba03aa20fc4204/spring-web/src/main/java/org/springframework/web/bind/annotation/ExceptionHandler.java#L33

+0

これで、最も一致するハンドラが1つだけ発生すると言います。 – Akah