日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多个服务间多个自定义的ExceptionHandler类的执行顺序

發(fā)布時間:2025/3/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多个服务间多个自定义的ExceptionHandler类的执行顺序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、場景

假設我有2個服務xxx-commonxxx-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 通過遞歸查找調(diào)用鏈,內(nèi)部自己判斷決定的。調(diào)用鏈越小,執(zhí)行度越高。

詳情請看此鏈接:(轉載)https://juejin.im/post/5d022d50f265da1bb564f374

?

總結

以上是生活随笔為你收集整理的多个服务间多个自定义的ExceptionHandler类的执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。