3 回答

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

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