修改日志:
2021-08-27 補充源碼說明,增加@Order、@Priority、@Primary 三個注解和 Ordered 接口 說明
我們的項目中經常會使用到別人的模塊,例如我的項目demo,要依賴別人的A模塊,以及基礎的核心core模塊,此時core模塊有一個使用了@RestControllerAdvice的類,負責攔截所有的controller異常。
但是呢,他的異常處理不符合我們demo項目的要求,這就導致我們demo項目要重寫自己的controller異常攔截。
此時我們可以用的解決異常的方法有三種:
1、使用aop進行切面攔截異常
2、controller每個方法都用try-catch捕獲異常
3、增加一個@RestControllerAdvice標注的類,負責處理我們項目的controller異常。
我選用第三種方法,但是當我寫了個PartControllerAdvice類,指定basePackages為我自己的項目包,依舊還是被core模塊的全局異常處理類攔截了。
查資料和找博客發現如果有多個加了@RestControllerAdvice的類,他們會依次加載,遇到異常時,按照類加載順序進行判斷,如果前面的類有能處理這個異常的方法,就給前面的類處理。
我的項目中有兩個標注了@RestControllerAdvice的類,core模塊的類被先加載,且core模塊的異常處理類有個方法專門處理Exception類型的異常,所以我的局部異常處理類始終不執行。
解決方法:
@Order(Ordered.HIGHEST_PRECEDENCE) 使用@Order注解,提高自己的局部異常處理類的加載順序就行了
代碼:
模擬效果:
參考文章:https://www.cnblogs.com/code-to-world/p/12779588.html springboot多個@ControllerAdvice全局異常處理
源碼說明:
@Order、@Priority、@Primary 三個注解和 Orderd 接口 說明
- orderd接口,實現Oderd接口的話要實現int getOrder();這個方法,返回一個整數值,值越小優先級越高。
-
@Order里面存儲了一個值,默認為Integer的最大值,同樣值越小優先級越高。要注意@Order只能控制組件的加載順序,不能控制注入的優先級。但是能控制List 里面存放的XXX的順序,原因是當通過構造函數或者方法參數注入進某個List時,Spring的DefaultListableBeanFactory類會在注入時調用AnnotationAwareOrderComparator.sort(listA)幫我們去完成根據@Order或者Ordered接口序值排序。@Order更加適用於集合注入的排序。
-
@Priority與@Order類似,@Order是Spring提供的注解,@Priority是JSR 250標准,同樣是值越小優先級越高。但是兩者還是有一定卻別,@Priority能夠控制組件的加載順序,因此@Priority側重於單個注入的優先級排序。此外@Priority優先級比@Order更高,兩者共存時優先加載@Priority。
- @Primary是優先級最高的,如果同時有@Primary以及其他幾個的話,@Primary注解的Bean會優先加載。