自定义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
相关产品推荐
相关产品推荐

