首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SpringBoot使用ControllerAdvice中的自定义错误处理所有错误

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

Stack Overflow用户
提问于 2020-07-07 17:12:38
回答 2查看 515关注 0票数 0

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

例如,像RequestRejectedException这样的异常不是通过控制器通知来处理的。有没有一种优雅的方法来处理Spring的one处理程序中可能出现的错误?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-07 17:52:37

控制器通知能够处理由控制器方法调用启动的任何流产生的任何异常。

这是"Spring MVC“处理异常的通用方法。

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

但是,您也可以使用Servlet的过滤器,这些过滤器是由底层web容器(如tomcat或jetty)直接部署和处理的。因此,如果代码产生异常,那么它甚至不会到达MVC控制器,因此控制器通知不能拦截该异常。

您还没有指定具体是哪段代码产生了RequestRejectedException,但这可能是在spring mvc之外完成的,因此控制器建议不适用……

票数 1
EN

Stack Overflow用户

发布于 2020-07-07 17:34:20

对于ControllerAdvice,类似于:

代码语言:javascript
运行
复制
@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。因此,处理此问题的方法之一是使用具有最高顺序的筛选器,并在该筛选器中捕获此异常并将响应转换为您想要的响应。

相关堆栈溢出线程:Spring 5.0.3 RequestRejectedException: The request was rejected because the URL was not normalized

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62771839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档