これは、Spring MVCの動作をどのように期待するのでしょうか?
Spring 4.3.7以降、SpringMVCの動作は次のとおりHandlerExceptionResolverです。インスタンスを使用してハンドラーメソッドによってスローされた例外を処理します。
デフォルトでは、Web MVC構成は単一のHandlerExceptionResolverBean、aを登録しますHandlerExceptionResolverComposite。
他のリストに委任しHandlerExceptionResolversます。
それらの他のリゾルバは
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
その順番で登録しました。この質問の目的のために、私たちは気にするだけExceptionHandlerExceptionResolverです。
AbstractHandlerMethodExceptionResolver例外を解決している@ExceptionHandler方法。
コンテキストの初期化時に、Springは検出したアノテーション付きクラスControllerAdviceBeanごとにを生成@ControllerAdviceします。ExceptionHandlerExceptionResolver文脈からこれらを取得し、それらを使用して使用してソートされますAnnotationAwareOrderComparatorどの
は、OrderComparatorSpringのOrdered
インターフェース@Orderと@Priorityアノテーションをサポートする拡張機能であり、静的に定義されたアノテーション値(存在する場合)をオーバーライドするOrderedインスタンスによって提供されるオーダー値を使用します。
次にExceptionHandlerMethodResolver、これらのControllerAdviceBeanインスタンスごとにを登録します(使用可能な@ExceptionHandlerメソッドを、処理する予定の例外タイプにマッピングします)。これらは最終的に同じ順序でLinkedHashMap(反復順序を保持する)に追加されます。
例外が発生すると、ExceptionHandlerExceptionResolverはこれらを繰り返しExceptionHandlerMethodResolver処理し、例外を処理できる最初の例外を使用します。
だからここでのポイントは以下のとおりです。あなたが持っている場合@ControllerAdviceと@ExceptionHandlerするためにException、別の前に登録されることを@ControllerAdvice持つクラス@ExceptionHandlerより具体的な例外、等のためのIOException最初のものが呼び出されますことを、。前述したように、あなたの持っていることによって、その登録順序を制御することができ@ControllerAdvice、注釈付きクラスが実装しOrderedたりして、それに注釈を付ける@Orderか@Priority、それに適切な値を与えます。
@ExceptionHandlerメソッドがある場合@ControllerAdvice、スローされた例外の最も具体的なスーパークラスを処理するメソッドが選択されます。