これは、Spring MVCの動作をどのように期待するのでしょうか?
Spring 4.3.7以降、SpringMVCの動作は次のとおりHandlerExceptionResolver
です。インスタンスを使用してハンドラーメソッドによってスローされた例外を処理します。
デフォルトでは、Web MVC構成は単一のHandlerExceptionResolver
Bean、aを登録しますHandlerExceptionResolverComposite
。
他のリストに委任しHandlerExceptionResolvers
ます。
それらの他のリゾルバは
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
その順番で登録しました。この質問の目的のために、私たちは気にするだけExceptionHandlerExceptionResolver
です。
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
、それに適切な値を与えます。
@ExceptionHandler
メソッドがある場合@ControllerAdvice
、スローされた例外の最も具体的なスーパークラスを処理するメソッドが選択されます。