Spring MVC'nin böyle davranması beklenir mi?
Spring 4.3.7'den itibaren, Spring MVC şu şekilde davranır: HandlerExceptionResolverİşleyici yöntemleri tarafından oluşturulan istisnaları işlemek için örnekleri kullanır .
Varsayılan olarak, web MVC yapılandırması tek bir HandlerExceptionResolverbean kaydeder , a HandlerExceptionResolverComposite,
diğerlerinin listesine delegeler HandlerExceptionResolvers.
Bu diğer çözücüler
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
bu sırayla kayıtlı. Bu sorunun amacı için sadece önemsiyoruz ExceptionHandlerExceptionResolver.
Bir AbstractHandlerMethodExceptionResolveraracılığıyla özel durumları çözer @ExceptionHandleryöntemlerle.
Bağlam başlatma sırasında Spring, algıladığı ControllerAdviceBeanher @ControllerAdviceaçıklamalı sınıf için bir tane oluşturur . ExceptionHandlerExceptionResolverBağlamdan bunlar almak ve bunları kullanarak kullanarak sıralanır AnnotationAwareOrderComparatorhangi
Statik olarak tanımlanmış bir açıklama değerini (varsa) geçersiz kılan Sıralı bir örnek tarafından sağlanan bir sipariş değeriyle OrderComparatorSpring'in Ordered
arayüzünü @Orderve @Priorityek açıklamaları destekleyen bir uzantısıdır .
Daha sonra ExceptionHandlerMethodResolver, bu ControllerAdviceBeanörneklerin her biri için bir tane kaydeder (mevcut @ExceptionHandleryöntemleri, işlemesi gereken istisna türleriyle eşleme ). Bunlar nihayet aynı sırayla a'ya eklenir LinkedHashMap(yineleme sırasını korur).
Bir istisna meydana geldiğinde, ExceptionHandlerExceptionResolverbunları yineleyecek ExceptionHandlerMethodResolverve istisnayı işleyebilen ilkini kullanacaktır.
Yani buradaki nokta şudur: eğer @ControllerAdvicebir @ExceptionHandlerfor a sahipseniz, Exceptionbaşka bir @ControllerAdvicesınıftan önce @ExceptionHandlerdaha özel bir istisna ile kayıt olursanız IOException, o ilk çağrılır. Daha önce belirtildiği gibi, kendi alarak bu kaydı sırasını kontrol edebilir @ControllerAdviceaçıklamalı sınıf uygulamak Orderedveya açıklayarak @Orderveya @Priorityve ona uygun bir değer veren.
@ExceptionHandleryöntem olması durumunda@ControllerAdvice, atılan istisnanın en spesifik üst sınıfını işleyen yöntem seçilir.