You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Spring异常处理器返回空响应体问题求助

问题分析与解决

问题现象

自定义了ApiExceptionHandler、ApiException和ApiErrorResponse用于返回JSON格式错误信息,控制器抛出ApiException后能被正确捕获,但最终返回的响应体为空,ResponseEntity中的内容消失。

核心原因

你抛出异常时使用了HttpStatus.NO_CONTENT(204状态码),根据HTTP协议规范,204响应不允许包含任何响应体。Spring MVC会自动清空该状态码对应的响应体,所以即使你在ResponseEntity中设置了ApiErrorResponse,最终也不会返回给客户端。

解决方案

1. 替换为符合业务场景的状态码

针对“未找到公司”的业务场景,更适合使用HttpStatus.NOT_FOUND(404)状态码,修改控制器中的异常抛出代码:

if (companies.isEmpty()) {
    throw new ApiException(HttpStatus.NOT_FOUND,
                           "No company",
                           List.of("Company not found"));
}

这样既能正确返回自定义的错误JSON体,也符合HTTP状态码的语义规范。

2. (可选)若坚持使用204(不推荐)

如果一定要用204状态码,必须接受响应体为空的结果——这是HTTP规范的强制要求,但显然不符合你需要返回错误信息的需求,因此不建议这么做。

额外验证点

可以确认ApiErrorResponse的序列化是否正常:

  • 确保项目已引入Jackson相关依赖(Spring Boot Web模块默认包含)
  • 确认HttpStatus和LocalDateTime能被正常序列化(Spring Boot 2.x+默认支持这两类对象的序列化)

内容的提问来源于stack exchange,提问作者pincoin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:17:41