簡體   English   中英

Spring Boot @ControllerAdvice異常處理程序沒有觸發

[英]Spring Boot @ControllerAdvice exception handler not firing

我設置了以下控制器建議,以返回錯誤條件的API合同:

@ControllerAdvice
public class ExceptionHandler : ResponseEntityExceptionHandler()
{
    @ExceptionHandler(Throwable::class)
    @ResponseBody
    public fun onException(ex: Throwable): ResponseEntity<ErrorResponse>
    {
        val errorResponse = ErrorResponse(
           response = ResponseHeader(ex.responseCode(), ex.message))
        return ResponseEntity(errorResponse, HttpStatus.UNAUTHORIZED);
    }

}

工作的罰款,然后停止工作。 現在所有異常都被路由到BasicErrorController ,它返回以下格式:

{
  "timestamp" : 1450495303166,
  "status" : 403,
  "error" : "Forbidden",
  "message" : "Access Denied",
  "path" : "/profile/candidates"
}

以上是一個很好的自以為是的起點,但現在它不會讓步。

  • 我試過用一個ExceptionHandlerExceptionResolver實例替換錯誤處理程序,但是沒有用。
  • 我已經嘗試制作自己的CustomErrorHandler,但這也不合適,因為在重新路由到自定義錯誤控制器時,原始異常不再出現在HttpServletRequest 需要此信息才能向客戶端返回適當的響應。

我怎么樣:

  • 使SpringBoot 向異常控制器轉發異常。
  • 恢復@ControllerAdvice異常處理程序,這樣我就可以返回一個合適的響應體和狀態代碼。

在啟動彈簧日志:

main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in exceptionHandler
main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in responseEntityExceptionHandler

編輯:

通過Spring引導文檔閱讀后,我現在下站在了BasicErrorController情況應該只是一個火沒有被處理的任何異常@ControllerAdvice 這似乎沒有發生。 所以問題是為什么?

我還有一個Spring Security過濾器,用於評估API-Key和Access-Token標頭憑據。 @ControllerAdvice在這里不起作用 - 公平,因為我們沒有處理控制器端點!

使用EntryPoint和AcessDeniedHandler處理安全過濾器的異常。 里面可以配置:

.exceptionHandling()

如果在過濾器中擴展AbstractAuthenticationProcessingFilter,請配置FailureHandler。

 setAuthenticationFailureHandler()

如果要在應用程序服務器下部署應用程序,Afaik ErrorController將被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM