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

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响应体的自动剥离:

  1. 新增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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:36:03