3 回答

TA貢獻1780條經(jīng)驗 獲得超1個贊
這是人們期望Spring MVC表現(xiàn)的方式嗎?
從Spring 4.3.7開始,Spring MVC的行為如下:它使用HandlerExceptionResolver實例來處理由處理程序方法引發(fā)的異常。
默認情況下,Web MVC配置注冊一個HandlerExceptionResolverbean HandlerExceptionResolverComposite,即
委托其他名單HandlerExceptionResolvers。
那些其他解析器是
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
以該順序注冊。出于這個問題的目的,我們只關(guān)心ExceptionHandlerExceptionResolver。
一AbstractHandlerMethodExceptionResolver,通過解析異常@ExceptionHandler的方法。
在上下文初始化時,Spring將為它檢測到的ControllerAdviceBean每個帶@ControllerAdvice注釋的類生成一個。該ExceptionHandlerExceptionResolver會從上下文檢索這些,并使用排序,使用AnnotationAwareOrderComparator其
是對擴展的OrderComparator支持,它支持Spring的Ordered 接口以及@Order和@Priority批注,并由Ordered實例提供的訂單值覆蓋靜態(tài)定義的批注值(如果有)。
然后,ExceptionHandlerMethodResolver將為每個這些ControllerAdviceBean實例注冊一個(將可用@ExceptionHandler方法映射到它們打算處理的異常類型)。最后,將它們以相同的順序添加到中LinkedHashMap(保留迭代順序)。
當發(fā)生異常時,ExceptionHandlerExceptionResolver會遍歷這些異常ExceptionHandlerMethodResolver并使用可以處理異常的第一個異常。
因此,這里的一點是:如果你有一個@ControllerAdvice帶有@ExceptionHandler用于Exception該被另一注冊前@ControllerAdvice與類@ExceptionHandler的更具體的例外,比如IOException,是第一個將被調(diào)用。如前所述,您可以通過@ControllerAdvice實現(xiàn)Ordered帶注釋的類或用@Order或?qū)ζ溥M行注釋@Priority并為其指定適當?shù)闹祦砜刂圃撟皂樞颉?/p>
- 3 回答
- 0 關(guān)注
- 7447 瀏覽
添加回答
舉報