当前位置: 首页 > 知识库问答 >
问题:

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

章振
2023-03-14

我有一个REST APISpring启动应用程序,并希望处理控制器Advice中的任何错误,因为我希望有一个自定义的响应格式,而不是使用Spring默认响应。

例如,RequestRejectedException之类的异常不会通过Controller建议处理。在Spring上,是否有一种优雅的方法来处理单处理程序中可能出现的错误?

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

共有2个答案

方安怡
2023-03-14

与控件建议类似:

@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:请求被拒绝,因为URL未规范化

吕霍英
2023-03-14

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

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

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

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

您还没有指定哪个代码确切地生成RequestRejectedException,但这可能是在spring mvc之外完成的,因此控制器建议不适用。。。

 类似资料:
  • 所有的错误最终都会被 Tango.ErrHandler 进行处理。 你可以自定义你的错误处理方式来替代默认的。例如: var ( prefix = "<html><head>tango</head><body><div>" suffix = fmt.Sprintf("</div><div>version: %s</div></body></html>", tango.Version

  • 404和500错误客户端和服务端都会通过error.js组件处理。如果你想改写它,则新建_error.js在文件夹中: import React from 'react' export default class Error extends React.Component { static getInitialProps({ res, err }) { const statusCod

  • 本文向大家介绍SpringBoot 错误处理机制与自定义错误处理实现详解,包括了SpringBoot 错误处理机制与自定义错误处理实现详解的使用技巧和注意事项,需要的朋友参考一下 【1】SpringBoot的默认错误处理 ① 浏览器访问 请求头如下: ② 使用“PostMan”访问 请求头如下: 总结:如果是浏览器访问,则SpringBoot默认返回错误页面;如果是其他客户端访问,则默认返回JSO

  • 修改日志 2019-07-30 优化了 logger.go,日志新增了返回数据。 调用 alarm.WeChat("错误信息") alarm.Email("错误信息") alarm.Sms("错误信息") alarm.Panic("错误信息") 运行 下载源码后,请先执行 dep ensure 下载依赖包! 效果 {"time":"2019-07-23 22:55:27","alarm":

  • 修改日志 2019-07-30 优化了 logger.go,日志新增了返回数据。 调用 alarm.WeChat("错误信息") alarm.Email("错误信息") alarm.Sms("错误信息") alarm.Panic("错误信息") 运行 下载源码后,请先执行 dep ensure 下载依赖包! 效果 {"time":"2019-07-23 22:55:27","alarm":

  • 概述 开始今天的文章,为什么要自定义错误处理?默认的错误处理方式是什么? 那好,咱们就先说下默认的错误处理。 默认的错误处理是 errors.New("错误信息"),这个信息通过 error 类型的返回值进行返回。 举个简单的例子: func hello(name string) (str string, err error) { if name == "" { err =