이것이 Spring MVC가 동작 할 것으로 기대하는 방식입니까?
Spring 4.3.7부터 Spring MVC가 작동하는 방식은 다음과 같습니다. HandlerExceptionResolver
인스턴스를 사용 하여 핸들러 메서드에서 발생한 예외를 처리합니다.
기본적으로 웹 MVC 구성은 하나의 등록 HandlerExceptionResolver
bean을하는 HandlerExceptionResolverComposite
, 어떤
다른 HandlerExceptionResolvers
.
다른 리졸버는
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
그 순서대로 등록되었습니다. 이 질문의 목적을 위해 우리는 ExceptionHandlerExceptionResolver
.
메서드를 AbstractHandlerMethodExceptionResolver
통해 예외를 해결 하는 입니다 @ExceptionHandler
.
컨텍스트 초기화에서 Spring은 감지 ControllerAdviceBean
하는 각 @ControllerAdvice
주석이 달린 클래스 에 대해 생성합니다 . 는 ExceptionHandlerExceptionResolver
상황에서 이러한를 검색하고이를 사용하여 정렬합니다 AnnotationAwareOrderComparator
있는
은 (는) 정적으로 정의 된 주석 값 (있는 경우)을 재정의하는 Ordered 인스턴스에서 제공하는 주문 값과 함께 및 주석
뿐 아니라 OrderComparator
Spring의 Ordered
인터페이스 를 지원 하는의 확장입니다 .@Order
@Priority
그런 다음 ExceptionHandlerMethodResolver
각 ControllerAdviceBean
인스턴스 에 대해 를 등록 합니다 (사용 가능한 @ExceptionHandler
메서드를 처리하려는 예외 유형에 매핑 ). 마지막으로 동일한 순서로 a에 추가됩니다 LinkedHashMap
(반복 순서 유지).
예외가 발생 ExceptionHandlerExceptionResolver
하면는 이러한 항목을 반복 ExceptionHandlerMethodResolver
하고 예외를 처리 할 수있는 첫 번째 항목을 사용합니다.
여기에 포인트 그래서입니다 : 당신이있는 경우 @ControllerAdvice
에 @ExceptionHandler
대한 Exception
그 다른 이전에 등록됩니다 @ControllerAdvice
와 클래스 @ExceptionHandler
보다 구체적인 예외, 등에 IOException
, 첫 번째가 호출되는 것이다. 앞서 언급 한 바와 같이, 당신은 당신의 필요에 의해 그 등록 순서를 제어 할 수 @ControllerAdvice
주석 클래스가 구현 Ordered
또는 그것을 주석 @Order
또는 @Priority
그것에게 적절한 값을 제공합니다.
@ExceptionHandler
메서드@ControllerAdvice
의 경우 throw 된 예외의 가장 구체적인 슈퍼 클래스를 처리하는 메서드 가 선택됩니다.