You need to enable JavaScript to run this app. 如何实现支持偶发无返回体的REST调用,处理Spring ResponseEntity空body异常
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持偶发无返回体的REST调用,处理Spring ResponseEntity空body异常

问题根因

你遇到的异常是因为当服务返回无响应体的202状态码时,你指定的响应类型为String,Spring默认的StringHttpMessageConverter读取空输入流会返回null,而ResponseEntity<String>的构造逻辑校验不允许body为null,因此抛出java.lang.IllegalArgumentException: argument "content" is null。

可行解决方案

以下三种方案可根据你的业务场景选择:

  • 方案1:兼容原有调用逻辑,修改RestTemplate全局配置
    替换RestTemplate中默认的StringHttpMessageConverter,让空响应体返回空字符串而非null,不需要修改任何原有调用代码:
import org.springframework.http.converter.StringHttpMessageConverter;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.springframework.http.converter.HttpMessageConverter;

// 初始化RestTemplate时调整配置
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
for (int i = 0; i < converters.size(); i++) {
    if (converters.get(i) instanceof StringHttpMessageConverter) {
        converters.set(i, new StringHttpMessageConverter(StandardCharsets.UTF_8) {
            @Override
            protected String readInternal(Class<? extends String> clazz, org.springframework.http.HttpInputMessage inputMessage) throws java.io.IOException {
                if (inputMessage.getBody().available() <= 0) {
                    return "";
                }
                return super.readInternal(clazz, inputMessage);
            }
        });
        break;
    }
}
  • 方案2:单个接口适配,动态处理不同响应状态
    调用exchange方法时先使用Object.class作为响应类型,拿到响应后先判断状态码再处理,无需修改全局配置:
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

ResponseEntity<Object> response = restTemplate.exchange(
    请求URL,
    请求方法,
    请求实体,
    Object.class
);

if (HttpStatus.ACCEPTED.equals(response.getStatusCode())) {
    // 202场景无需读取响应体,直接走对应业务逻辑
} else {
    String body = (String) response.getBody();
    // 原有带响应体的业务逻辑
}
  • 方案3:明确接口返回规则的场景下,使用Void作为响应类型
    如果该接口只有202无响应体一种返回场景,直接将响应类型指定为Void.class即可,Spring会自动忽略响应体解析:
ResponseEntity<Void> response = restTemplate.exchange(
    url,
    method,
    requestEntity,
    Void.class
);

内容的提问来源于stack exchange,提问作者Leo H.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:21:02