Czy tak będzie się zachowywać Spring MVC?
Począwszy od wersji Spring 4.3.7, tak zachowuje się Spring MVC: używa on HandlerExceptionResolver
instancji do obsługi wyjątków generowanych przez metody obsługi.
Domyślnie konfiguracja sieci Web MVC rejestruje pojedynczy HandlerExceptionResolver
komponent bean HandlerExceptionResolverComposite
, który
delegaci na listę innych HandlerExceptionResolvers
.
Te inne resolwery są
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
zarejestrowane w tej kolejności. Na potrzeby tego pytania tylko nam zależy ExceptionHandlerExceptionResolver
.
AbstractHandlerMethodExceptionResolver
Że postanawia wyjątki poprzez @ExceptionHandler
metod.
Podczas inicjalizacji kontekstu Spring wygeneruje ControllerAdviceBean
dla każdej @ControllerAdvice
wykrytej klasy z adnotacjami. ExceptionHandlerExceptionResolver
Pobierze je z kontekstu i sortować je za pomocą za pomocą AnnotationAwareOrderComparator
którego
jest rozszerzeniem OrderComparator
obsługującym Ordered
interfejs Springa, a także adnotacje @Order
i @Priority
, z wartością zamówienia dostarczoną przez instancję Ordered przesłaniającą statycznie zdefiniowaną wartość adnotacji (jeśli istnieje).
Następnie zarejestruje ExceptionHandlerMethodResolver
dla każdego z tych ControllerAdviceBean
wystąpień (mapowanie dostępnych @ExceptionHandler
metod na typy wyjątków, które mają obsługiwać). Są one ostatecznie dodawane w tej samej kolejności do a LinkedHashMap
(co zachowuje kolejność iteracji).
Gdy wystąpi wyjątek, ExceptionHandlerExceptionResolver
will iteruje przez nie ExceptionHandlerMethodResolver
i używa pierwszego, który może obsłużyć wyjątek.
Chodzi o to, że jeśli masz a @ControllerAdvice
z @ExceptionHandler
for, Exception
który zostanie zarejestrowany przed inną @ControllerAdvice
klasą z @ExceptionHandler
bardziej szczegółowym wyjątkiem, na przykład IOException
, zostanie wywołany ten pierwszy. Jak wspomniano wcześniej, możesz kontrolować kolejność rejestracji, @ControllerAdvice
implementując klasę z Ordered
adnotacjami lub dodając do niej adnotację @Order
lub @Priority
i nadając jej odpowiednią wartość.
@ExceptionHandler
metod w ramach a@ControllerAdvice
, wybierana jest ta, która obsługuje najbardziej szczegółową nadklasę rzuconego wyjątku.