Czy tak będzie się zachowywać Spring MVC?
Począwszy od wersji Spring 4.3.7, tak zachowuje się Spring MVC: używa on HandlerExceptionResolverinstancji do obsługi wyjątków generowanych przez metody obsługi.
Domyślnie konfiguracja sieci Web MVC rejestruje pojedynczy HandlerExceptionResolverkomponent 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 @ExceptionHandlermetod.
Podczas inicjalizacji kontekstu Spring wygeneruje ControllerAdviceBeandla każdej @ControllerAdvicewykrytej klasy z adnotacjami. ExceptionHandlerExceptionResolverPobierze je z kontekstu i sortować je za pomocą za pomocą AnnotationAwareOrderComparatorktórego
jest rozszerzeniem OrderComparatorobsługującym Ordered
interfejs Springa, a także adnotacje @Orderi @Priority, z wartością zamówienia dostarczoną przez instancję Ordered przesłaniającą statycznie zdefiniowaną wartość adnotacji (jeśli istnieje).
Następnie zarejestruje ExceptionHandlerMethodResolverdla każdego z tych ControllerAdviceBeanwystąpień (mapowanie dostępnych @ExceptionHandlermetod 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, ExceptionHandlerExceptionResolverwill iteruje przez nie ExceptionHandlerMethodResolveri używa pierwszego, który może obsłużyć wyjątek.
Chodzi o to, że jeśli masz a @ControllerAdvicez @ExceptionHandlerfor, Exceptionktóry zostanie zarejestrowany przed inną @ControllerAdviceklasą z @ExceptionHandlerbardziej szczegółowym wyjątkiem, na przykład IOException, zostanie wywołany ten pierwszy. Jak wspomniano wcześniej, możesz kontrolować kolejność rejestracji, @ControllerAdviceimplementując klasę z Orderedadnotacjami lub dodając do niej adnotację @Orderlub @Priorityi nadając jej odpowiednią wartość.
@ExceptionHandlermetod w ramach a@ControllerAdvice, wybierana jest ta, która obsługuje najbardziej szczegółową nadklasę rzuconego wyjątku.