Spring Boot @ControllerAdvice异常处理程序未触发

时间:2015-12-19 03:31:07

标签: java spring spring-mvc spring-boot kotlin

我设置了以下控制器建议,以返回错误条件的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 Boot文档之后,我现在认为BasicErrorController只应针对由@ControllerAdvice处理的而不是的任何异常触发。这似乎没有发生。所以问题是为什么?

1 个答案:

答案 0 :(得分:1)

  

我还有一个Spring Security过滤器,用于评估API-Key和Access-Token标头凭据。 @ControllerAdvice不在这里工作 - 公平,因为我们没有处理控制器端点!

使用EntryPoint和AcessDeniedHandler处理安全过滤器的异常。可以在里面配置:

.exceptionHandling()

如果在过滤器中扩展AbstractAuthenticationProcessingFilter,请配置FailureHandler。

 setAuthenticationFailureHandler()

如果您将应用程序部署在应用程序服务器下,则会覆盖Afaik ErrorController。