亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

設置多個@ControllerAdvice @ExceptionHandlers的優先級

設置多個@ControllerAdvice @ExceptionHandlers的優先級

RISEBY 2019-12-11 16:09:07
我有多個用注釋的類@ControllerAdvice,每個類都有一個@ExceptionHandler方法。一個處理程序Exception的意圖是,如果找不到更多特定的處理程序,則應使用該處理程序。遺憾的是,Spring MVC似乎總是使用最通用的情況(Exception),而不是使用更具體的情況(IOException例如)。這是人們期望Spring MVC表現的方式嗎?我試圖從Jersey模擬一個模式,該模式評估每個ExceptionMapper(等效組件)以確定它處理的聲明類型與引發的異常之間的距離,并且始終使用最接近的祖先。
查看完整描述

3 回答

?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

這是人們期望Spring MVC表現的方式嗎?


從Spring 4.3.7開始,Spring MVC的行為如下:它使用HandlerExceptionResolver實例來處理由處理程序方法引發的異常。


默認情況下,Web MVC配置注冊一個HandlerExceptionResolverbean HandlerExceptionResolverComposite,即


委托其他名單HandlerExceptionResolvers。


那些其他解析器是


ExceptionHandlerExceptionResolver

ResponseStatusExceptionResolver

DefaultHandlerExceptionResolver

以該順序注冊。出于這個問題的目的,我們只關心ExceptionHandlerExceptionResolver。


一AbstractHandlerMethodExceptionResolver,通過解析異常@ExceptionHandler的方法。


在上下文初始化時,Spring將為它檢測到的ControllerAdviceBean每個帶@ControllerAdvice注釋的類生成一個。該ExceptionHandlerExceptionResolver會從上下文檢索這些,并使用排序,使用AnnotationAwareOrderComparator其


是對擴展的OrderComparator支持,它支持Spring的Ordered 接口以及@Order和@Priority批注,并由Ordered實例提供的訂單值覆蓋靜態定義的批注值(如果有)。


然后,ExceptionHandlerMethodResolver將為每個這些ControllerAdviceBean實例注冊一個(將可用@ExceptionHandler方法映射到它們打算處理的異常類型)。最后,將它們以相同的順序添加到中LinkedHashMap(保留迭代順序)。


當發生異常時,ExceptionHandlerExceptionResolver會遍歷這些異常ExceptionHandlerMethodResolver并使用可以處理異常的第一個異常。


因此,這里的一點是:如果你有一個@ControllerAdvice帶有@ExceptionHandler用于Exception該被另一注冊前@ControllerAdvice與類@ExceptionHandler的更具體的例外,比如IOException,是第一個將被調用。如前所述,您可以通過@ControllerAdvice實現Ordered帶注釋的類或用@Order或對其進行注釋@Priority并為其指定適當的值來控制該注冊順序。



查看完整回答
反對 回復 2019-12-12
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

這是人們期望Spring MVC表現的方式嗎?


從Spring 4.3.7開始,Spring MVC的行為如下:它使用HandlerExceptionResolver實例來處理由處理程序方法引發的異常。


默認情況下,Web MVC配置注冊一個HandlerExceptionResolverbean HandlerExceptionResolverComposite,即


委托其他名單HandlerExceptionResolvers。


那些其他解析器是


ExceptionHandlerExceptionResolver

ResponseStatusExceptionResolver

DefaultHandlerExceptionResolver

以該順序注冊。出于這個問題的目的,我們只關心ExceptionHandlerExceptionResolver。


一AbstractHandlerMethodExceptionResolver,通過解析異常@ExceptionHandler的方法。


在上下文初始化時,Spring將為它檢測到的ControllerAdviceBean每個帶@ControllerAdvice注釋的類生成一個。該ExceptionHandlerExceptionResolver會從上下文檢索這些,并使用排序,使用AnnotationAwareOrderComparator其


是對擴展的OrderComparator支持,它支持Spring的Ordered 接口以及@Order和@Priority批注,并由Ordered實例提供的訂單值覆蓋靜態定義的批注值(如果有)。


然后,ExceptionHandlerMethodResolver將為每個這些ControllerAdviceBean實例注冊一個(將可用@ExceptionHandler方法映射到它們打算處理的異常類型)。最后,將它們以相同的順序添加到中LinkedHashMap(保留迭代順序)。


當發生異常時,ExceptionHandlerExceptionResolver會遍歷這些異常ExceptionHandlerMethodResolver并使用可以處理異常的第一個異常。


因此,這里的一點是:如果你有一個@ControllerAdvice帶有@ExceptionHandler用于Exception該被另一注冊前@ControllerAdvice與類@ExceptionHandler的更具體的例外,比如IOException,是第一個將被調用。如前所述,您可以通過@ControllerAdvice實現Ordered帶注釋的類或用@Order或對其進行注釋@Priority并為其指定適當的值來控制該注冊順序。



查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 891 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號