Spring ControllerAdvice处理异常返回HTTP_NO_CONTENT时响应体为空如何解决
问题根因
HttpStatus.NO_CONTENT对应的204状态码本身的HTTP语义就是响应无内容,所有遵循HTTP协议的Web服务器、Spring MVC消息转换器默认都会自动剥离204状态响应的响应体,这是协议层面的默认约束,和你的业务代码逻辑无关。
解决方案
方案1:更换符合语义的状态码(推荐)
你当前的场景是客户端请求了不存在的资源,选择404 NOT_FOUND状态码更符合REST规范,且4xx状态码允许携带响应体。只需修改全局异常处理代码中的状态码即可:
@ExceptionHandler(NoLevelFoundException.class) public ResponseEntity<ResponseBody> handleNoLevelFoundException( NoLevelFoundException ex) { ex.printStackTrace(); ResponseBody error = new ResponseBody(); error.setTime(Timestamp.from(Instant.now())); error.setMessage(ex.getMessage()); // 把NO_CONTENT替换为NOT_FOUND return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); }
修改后即可正常返回携带时间戳、错误信息的响应体,同时状态码语义和业务场景匹配。
方案2:强制配置允许204状态携带响应体(不推荐,不符合HTTP规范)
如果业务强制要求必须返回204状态码同时携带响应内容,可以通过修改Spring配置和内嵌服务器配置,关闭对204响应体的自动剥离:
- 新增Web配置类,调整Jackson消息转换器和Tomcat服务器配置:
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { // 允许Jackson为空响应写JSON内容 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.stream() .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter) .forEach(converter -> ((MappingJackson2HttpMessageConverter) converter) .setWriteEmptyJson(true)); } // 关闭Tomcat对204响应的响应体自动移除逻辑 @Bean public TomcatServletWebServerFactory tomcatFactory() { return new TomcatServletWebServerFactory() { @Override protected void customizeConnector(Connector connector) { super.customizeConnector(connector); connector.setProperty("sendReasonPhrase", "true"); } }; } }
注意:该方案不符合RFC 9110 HTTP协议规范,部分代理服务器、客户端仍可能自动丢弃204响应的响应体,生产环境不建议使用。
内容的提问来源于stack exchange,提问作者Batuhan Kertmen Student
相关产品推荐
相关产品推荐

