多个服务间多个自定义的ExceptionHandler类的执行顺序
一、場景
假設我有2個服務:xxx-common 和 xxx-auth ,3個異常處理器。
目錄結構如下:
xxx-common? ?公共類存放的jar包
? ? ? ? 自定義的? ApiExceptionHandler 類 有2個異常處理器,分別是:
? ? ? ? ? ? ? ? ? ? ?① ApiException.class? ?和
? ? ? ? ? ? ? ? ? ? ?②?Exception.class
xxx-auth? ? ? ? ? Shiro授權認證的jar包
? ? ? ??自定義的 AuthorizationExceptionHandler 類?只有1個異常處理器:
? ? ? ? ? ? ? ? ? ? ?③ AuthorizationException.class
二、問題
那么,在我A服務引入這兩個包的同時,如果我報的是?AuthorizationException 異常,有可能會先走?xxx-common 包下的
ApiExceptionHandler 類?中的?②?Exception.class 異常處理器,這并不是我想要的結果。
三、解決辦法
通過源碼可以知道Spring的異常處理器是根據(jù)異常處理器被加載的順序來順序執(zhí)行,
比如:A->B->C ,那么如果B符合拋出異常的條件,就會直接拋出,然而我們真正需要被執(zhí)行的C可能就執(zhí)行不到了。
此時,可以通過 @Order?注解來指定實體Bean被加載到Spring容器的順序,注解中的值越小越優(yōu)先加載。
@Order(1)//指定該實體bean被加載的順序,注解中的值越小越優(yōu)先被加載注入。 @RestControllerAdvice public class AuthorizationExceptionHandler {@ExceptionHandler(AuthorizationException.class)public Code handleAuthorizationException(AuthorizationException e) {log.error("沒有權限的異常信息:", e);return Code.NOT_PERMISSION.setErrCode(new Code().setMsg(e.getMessage()));}}四、結論
其實,多個服務間多個自定義的ExceptionHandler類的執(zhí)行順序就是被Spring加載到容器中Bean加載順序。
五、另外
在同一個自定義的ExceptionHandler類,定義多個異常處理器,他們的加載順序如何決定?
結論:是由?ExceptionHandlerMethodResolver 通過遞歸查找調用鏈,內部自己判斷決定的。調用鏈越小,執(zhí)行度越高。
詳情請看此鏈接:(轉載)https://juejin.im/post/5d022d50f265da1bb564f374
?
總結
以上是生活随笔為你收集整理的多个服务间多个自定义的ExceptionHandler类的执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZZULIOJ 1087: 获取出生日期
- 下一篇: ZZULIOJ 1094: 统计元音(函