0

我有一个 REST api spring boot 应用程序并希望处理 ControllerAdvice 中的任何错误,因为我希望有一个自定义的响应格式并且不使用 Spring 默认响应。

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

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

4

2 回答 2

1

Controller Advice 能够处理由控制器方法调用启动的任何流引发的任何异常。

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

现在 Spring MVC 的基础设施在技术上基于单个 servlet(称为 DispatcherServlet),它可以通过 url、http 方法等将控制器方法“分配”给调用。

但是,您可能会使用由底层 Web 容器(如 tomcat 或 jetty)直接部署和处理的 Servlet 过滤器。因此,如果该代码引发了异常,它对于 Spring MVC 来说是“看不见的”,它甚至不会到达 MVC 控制器,因此控制器建议无法拦截异常。

您尚未指定确切源自哪个代码,RequestRejectedException但这可能是在 spring mvc 之外完成的,因此控制器建议不适用...

于 2020-07-07T09:52:37.150 回答
0

使用 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 以不同的方式抛出的,它似乎不能像那样处理。阅读相关。因此,处理此问题的一种方法是使用最高阶的过滤器,并在该过滤器中捕获此异常并将响应转换为您想要的响应。

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

于 2020-07-07T09:34:19.543 回答