如何实现支持偶发无返回体的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.
相关产品推荐
相关产品推荐

