2013-12-12 52 views
2

我有一個類註解@ControllerAdvice與我的api的一些中央異常處理。它處理的一個例外是MethodArgumentNotValidException,當用@Valid註釋的請求方法參數未通過驗證時,會引發該異常。@ControllerAdvice方法似乎繞過攔截器

在我的應用程序中,我還有一個CORS攔截器設置,它在請求成功時將「Access-Control-Allow-Origin」頭添加到servlet響應中。然而,看起來當驗證失敗的參數註釋@Valid,我的攔截器被繞過。我的異常處理程序需要發送無效的表單字段的錯誤信息,以便在瀏覽器中處理它們。

只是想知道這是否是正常的行爲,我的攔截器在引發異常時被繞過,或者我在@ControllerAdvice類中丟失了一些配置。

+0

謝謝,但我不認爲它是重複的。我已經按照該帖子接受的回覆中描述的方式來處理我的異常。我的問題更多的是CORS請求問題,當我的異常處理程序被調用時,我的攔截器沒有裝飾servlet響應。 –

+0

你是對的.. – csn

回答

3

這確實是正常的行爲。

HandlerInterceptor.postHandle

截取的處理程序的執行的Javadoc。在HandlerAdapter實際調用處理程序之後調用,但在DispatcherServlet呈現該視圖之前調用。可以通過給定的ModelAndView將其他模型對象展示給視圖。 DispatcherServlet在執行鏈中處理一個處理程序,由任意數量的攔截器組成,處理器本身在最後。使用這種方法,每個攔截器可以後處理一個執行,並按照執行鏈的相反順序進行應用。

在實際調用方法之前拋出MethodArgumentNotValidException,在準備實際方法調用時會調用它。其實postHandle只有在成功執行/調用該方法後纔會執行。如果發生異常,只調用preHandleafterCompletion方法。

+0

謝謝!我確實實現了postHandle方法。我更改了我的代碼以實現preHandle方法,現在在引發異常的情況下,頭部已成功添加到響應中。 –