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

我设置了以下控制器建议,以针对错误情况返回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异常处理程序,以便我可以返回适当的响应主体和状态代码。
  • 在启动spring日志中:

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

    编辑:

    阅读完Spring Boot文档后,我现在明白了BasicErrorController仅应针对@ControllerAdvice未处理的任何异常触发。这似乎没有发生。那么问题是为什么呢?

    参考方案

    我还有一个Spring Security过滤器,用于评估API密钥和访问令牌标头凭证。 @ControllerAdvice在这里不起作用-足够公平,因为我们不处理控制器端点!

    使用EntryPoint和AcessDeniedHandler处理来自安全筛选器的异常。里面可以配置:

    .exceptionHandling()
    

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

     setAuthenticationFailureHandler()
    

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

    Spring Boot-使用上下文路径时在根级别的静态内容 - java

    假设我有一个application.yml内容server: port: 8000 context-path: /rest 因此,将像这样访问所有控制器和htmlhttp://server:8000/rest/controller因此,具有此配置...有可能在不更改其上下文路径的情况下将一些静态html元素添加到其根级别? (我已经将index.html添加…

    Spring Boot:java.time.Duration的默认序列化从字符串更改为数字 - java

    我们最近从Spring Boot 2.1.9升级到2.2.1,这导致我们的测试失败。调查导致结果,默认情况下java.time.Duration类型现在序列化为不同的序列。现在,我们将得到"PT15M",而不是在JSON消息中包含字符串"900.0"。 POJO定义如下所示@JsonProperty(required …

    Spring Boot-如何将application.yml属性定义为application.properties - java

    我目前正在尝试使用我的Spring Boot Web应用程序设置s3存储桶以添加/删除图像。我遵循的指南使用以下application.yml属性:amazonProperties: endpointUrl: https://s3.us-east-2.amazonaws.com accessKey: XXXXXXXXXXXXXXXXX secretKey: …

    Spring MVC中的输入验证 - java

    我知道Commons Validator框架是Struts项目在服务器端和客户端验证输入值的事实上的标准。Spring MVC项目是否也是如此?我得到的印象可能不是,大多数Struts书籍和论坛都谈论Commons Validator框架,但是只有少数Spring书籍和论坛可以。在Spring MVC项目中验证输入的最佳实践是什么?干杯! 参考方案 在引入S…

    Java:“自动装配”继承与依赖注入 - java

    Improve this question 我通常以常见的简单形式使用Spring框架: 控制器服务存储库通常,我会在CommonService类中放一个通用服务,并使所有其他服务扩展到类中。一个开发人员告诉我,最好在每个服务中插入CommonClass而不是使用继承。我的问题是,有一个方法比另一个更好吗? JVM或性能是否会受到另一个影响?更新资料Comm…