Sotirios Delimanolis は彼の回答で非常に役に立ちました。さらに調査したところ、Spring 3.2.4 では、@ControllerAdvice アノテーションを検索するコードも @Order アノテーションの存在をチェックし、ControllerAdviceBeans のリストをソートすることがわかりました。
@Order アノテーションのないすべてのコントローラーの結果のデフォルトの順序は Ordered#LOWEST_PRECEDENCE です。これは、最低の優先度にする必要があるコントローラーが 1 つある場合、すべてのコントローラーの順序を高くする必要があることを意味します。
UserProfileException または RuntimeException が発生したときに適切な応答を提供できる ControllerAdvice アノテーションと Order アノテーションを持つ 2 つの例外ハンドラー クラスを用意する方法を示す例を次に示します。
class UserProfileException extends RuntimeException {
}
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
class UserProfileExceptionHandler {
@ExceptionHandler(UserProfileException)
@ResponseBody
ResponseEntity<ErrorResponse> handleUserProfileException() {
....
}
}
@ControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE)
class DefaultExceptionHandler {
@ExceptionHandler(RuntimeException)
@ResponseBody
ResponseEntity<ErrorResponse> handleRuntimeException() {
....
}
}
- ControllerAdviceBean#initOrderFromBeanType() を参照してください。
- ControllerAdviceBean#findAnnotatedBeans() を参照してください
- ExceptionHandlerExceptionResolver#initExceptionHandlerAdviceCache() を参照してください。
楽しみ!