[解決済み] 複数の @ControllerAdvice @ExceptionHandler の優先順位を設定する。
質問
でアノテーションされた複数のクラスがあります。
@ControllerAdvice
でアノテーションされた複数のクラスがあり、それぞれのクラスには
@ExceptionHandler
のメソッドを使用します。
一つはハンドル
Exception
を扱うもので、より具体的なハンドラが見つからなければ、これを使うべきという意図です。
悲しいことに、Spring MVCは常に最も一般的なケース(
Exception
) を使うようです。
IOException
など) よりも、より具体的なものです。
これはSpring MVCがどのように振る舞うかを期待するものでしょうか?私はJerseyのパターンをエミュレートしようとしていて、それぞれの
ExceptionMapper
(等価なコンポーネント)を評価して、それが扱う宣言された型が投げられた例外からどれだけ離れているかを判断し、常に最も近い祖先を使用します。
どのように解決するのか?
Spring MVCの動作はこのようなものでしょうか?
Spring 4.3.7では、Spring MVCの動作は次のようになっています。
HandlerExceptionResolver
インスタンスを使用して、ハンドラメソッドによってスローされる例外を処理します。
デフォルトでは、web MVC の構成は単一の
HandlerExceptionResolver
ビーンを登録します。
HandlerExceptionResolverComposite
であり、これは
のリストに委ねる。
HandlerExceptionResolvers
.
それらの他のリゾルバは
-
ExceptionHandlerExceptionResolver
-
ResponseStatusExceptionResolver
-
DefaultHandlerExceptionResolver
の順で登録されています。この質問の目的では、私たちが気にするのは
ExceptionHandlerExceptionResolver
.
An
AbstractHandlerMethodExceptionResolver
で例外を解決する を通して@ExceptionHandler
メソッドによって例外を解決します。
コンテキストの初期化時に、Springは
ControllerAdviceBean
を生成します。
@ControllerAdvice
アノテーションされたクラスが検出されます。その
ExceptionHandlerExceptionResolver
は、これらをコンテキストから取得し
AnnotationAwareOrderComparator
という
の拡張です。
OrderComparator
の拡張で、SpringのOrdered
インターフェースだけでなく@Order
と@Priority
アノテーションがあり アノテーションの値は、Orderedインスタンスによって提供され、静的に定義されたアノテーションの値をオーバーライドします。 アノテーションの値があれば、それを上書きします。
次に
ExceptionHandlerMethodResolver
を登録します。
ControllerAdviceBean
インスタンス(マッピング可能な
@ExceptionHandler
メソッドを処理するための例外の種類に対応させます)。これらは最終的に同じ順序で
LinkedHashMap
に同じ順序で追加されます (これは反復の順序を維持します)。
例外が発生した場合は
ExceptionHandlerExceptionResolver
はこれらの
ExceptionHandlerMethodResolver
を順に処理し、例外を処理できる最初のものを使用します。
つまり、ここでのポイントは
@ControllerAdvice
と
@ExceptionHandler
に対して
Exception
の前に登録される
@ControllerAdvice
クラスで
@ExceptionHandler
のように、より具体的な例外を表すために
IOException
のように、より具体的な例外が発生した場合は、 その最初のものが呼ばれることになります。先に述べたように、この登録順序は
@ControllerAdvice
アノテーションされたクラスが
Ordered
でアノテーションを付けるか
@Order
または
@Priority
というように、適切な値を与えてください。
関連
-
[解決済み】BindingResultもBean名のプレーンターゲットオブジェクトもリクエスト属性として利用できない [重複].
-
[解決済み] Spring 3 リクエスト処理に失敗しました。ネストされた例外は java.lang.NullPointerException です。
-
[解決済み] Spring SecurityのantMatcher()はいつ使うのか?
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み] JAX-RSとSpring Restの違いについて
-
[解決済み] Spring mvc @PathVariable
-
[解決済み] Spring Controller のマッピングで url のパラメータを受け取るには?
-
[解決済み] SwaggerのURLに認証なしでアクセスできるようにSpring Securityを設定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】BindingResultもBean名のプレーンターゲットオブジェクトもリクエスト属性として利用できない [重複].
-
[解決済み] Spring 3 リクエスト処理に失敗しました。ネストされた例外は java.lang.NullPointerException です。
-
[解決済み] Spring SecurityのantMatcher()はいつ使うのか?
-
[解決済み】Spring MVCで静的コンテンツを処理する方法は?
-
[解決済み] JAX-RSとSpring Restの違いについて
-
[解決済み] Spring mvc @PathVariable
-
[解決済み] Spring Controller のマッピングで url のパラメータを受け取るには?
-
[解決済み] Spring MVCかSpring Bootか【終了しました
-
[解決済み] SwaggerのURLに認証なしでアクセスできるようにSpring Securityを設定する方法
-
[解決済み] Spring3コントローラで "ModelAndView "と "String "を返すのはどっちがいい?