SpringBoot 处理 ControllerAdvice 中自定义错误的所有错误

SpringBoot handle all errors with custom error in ControllerAdvice

我有一个 REST api spring 启动应用程序,我想处理 ControllerAdvice 中的任何错误,因为我想有一个自定义的响应格式,而不是使用 Spring默认响应。

例如,像 RequestRejectedException 这样的异常不是通过控制器建议处理的。有没有一种优雅的方法来处理 Spring 上的一个处理程序中任何可能的错误?

对于 RequestRejectedException,我已经实现了一个 GenericFilterBean 并在那里重新格式化了响应,但希望有一个更统一的方式来处理所有错误。

使用 ControllerAdvice 类似:

@ControllerAdvice
class GenericExceptionHandling extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = RuntimeException.class)
    protected ResponseEntity<Object> handleConflict(
      RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }

}

应该是有道理的,但是由于 spring 抛出的异常不同,所以似乎不能那样处理。阅读 related 。因此,处理此问题的方法之一是使用最高阶过滤器,并在该过滤器中捕获此异常并将响应转换为您想要的响应。

相关的 Whosebug 线程:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized

控制器建议能够处理由控制器方法调用启动的任何流引起的任何异常。

这是“Spring MVC”处理异常的通用方式。

现在 SpringMVC 的基础结构在技术上基于单个 servlet(称为 DispatcherServlet),它可以将控制器方法“分配”给 url、http 方法等的调用

然而,您可能会使用由底层 Web 容器(如 tomcat 或码头)直接部署和处理的 Servlet 过滤器。因此,如果该代码引发了异常,它是 spring MVC 的“视线之外”,它甚至没有到达 MVC 控制器,因此控制器建议无法拦截异常。

您没有具体说明 RequestRejectedException 是哪个代码产生的,但这可能是在 spring mvc 之外完成的,因此控制器建议不适用...