SpringBoot 自定义异常返回数据格式

Spring Boot 默认异常处理

当我们用 spring boot 开发接口是,当遇到异常时返回的数据格式是如下形式的

{
    "timestamp": "2024-07-06T02:48:55.791+00:00",
    "status": 404,
    "error": "Not Found",
    "path": "/test"
}
{
    "timestamp": "2024-07-06T02:53:09.108+00:00",
    "status": 500,
    "error": "Internal Server Error",
    "path": "/test"
}

这样的数据格式可能和我们接口的数据格式不相符,如果我们想让我们的服务返回统一的数据格式,就需要进行自定义异常处理。

Spring Boot 异常处理实现

当我们向 spring boot 应用发送请求,处理出错时(比如:404,或者对应的接口服务处理逻辑异常)都会将请求转发到 “/error”上,“/error” 的默认请求是由BasicErrorController 处理的核心代码如下:

@RequestMapping
	public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
		HttpStatus status = getStatus(request);
		if (status == HttpStatus.NO_CONTENT) {
			return new ResponseEntity<>(status);
		}
		Map<String, Object> body = getErrorAttributes(request, getErrorAttributeOptions(request, MediaType.ALL));
		return new ResponseEntity<>(body, status);
	}

处理完后的响应数据格式也就是上面我们提到的默认数据格式。

自定义异常返回数据格式

在 ErrorMvcAutoConfiguration 配置类中由如下代码

    @Bean
	@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
	public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
			ObjectProvider<ErrorViewResolver> errorViewResolvers) {
		return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
				errorViewResolvers.orderedStream().collect(Collectors.toList()));
	}

通过上述代码可知,只要我们自定义一个 ErrorController 类型的 bean ,BasicErrorController 就不会生效了,所以我们自定义一个 CustomerErrorController 并实现 ErrorController 代码如下

@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class CustomerErrorController implements ErrorController {

    @RequestMapping
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = new HashMap<>();
        body.put("code", "1001");
        body.put("message", "请求不存在");
        return new ResponseEntity<>(body, HttpStatus.NOT_FOUND);
    }
}

再次访问不存在的请求,返回如下数据格式

{
    "code": "1001",
    "message": "请求不存在"
}

自此,自定义异常返回数据格式功能大功告成。

相关推荐

  1. SpringBoot 定义异常返回数据格式

    2024-07-12 00:46:05       21 阅读
  2. SpringBoot 统一后端返回格式、处理全局异常

    2024-07-12 00:46:05       35 阅读
  3. Springboot定义全局异常处理

    2024-07-12 00:46:05       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 00:46:05       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 00:46:05       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 00:46:05       58 阅读
  4. Python语言-面向对象

    2024-07-12 00:46:05       69 阅读

热门阅读

  1. ubuntu 安装cups和爱普生打印机

    2024-07-12 00:46:05       19 阅读
  2. 服务器怎么进PE系统?

    2024-07-12 00:46:05       25 阅读
  3. 还在代码中写HttpUtil?是时候说再见啦

    2024-07-12 00:46:05       24 阅读
  4. selenium常用方法

    2024-07-12 00:46:05       24 阅读
  5. (九)Docker 的网络通信

    2024-07-12 00:46:05       22 阅读
  6. 【力扣】每日一题—第242题,有效的字母异位词

    2024-07-12 00:46:05       20 阅读
  7. Go单元测试

    2024-07-12 00:46:05       23 阅读
  8. C# IOC容器、依赖注入和控制反转

    2024-07-12 00:46:05       24 阅读
  9. 使用C++编写TCP服务端程序

    2024-07-12 00:46:05       24 阅读
  10. 什么是AQS

    2024-07-12 00:46:05       20 阅读