RestTemplate远程调用,响应结果中的响应头为content-type:text/plain;charset=utf-8,且数据类型转换失败
一、问题出现在使用RestTemplate发动远程调用某个api时,控制台打印了错误日志,说的是数据转换为对象失败,刚开始以为只是提供的类型不符合,后来依次试过list、map、JSONObject都是报一样的错误。报错信息类似如下:Could not extract response: no suitable HttpMessageConverter found for response typ
一、问题出现
在使用RestTemplate发动远程调用某个api时,控制台打印了错误日志,说的是数据转换为对象失败,刚开始以为只是提供的类型不符合,后来依次试过list、map、JSONObject都是报一样的错误。报错信息类似如下:
Could not extract response: no suitable HttpMessageConverter found for response type [interface java.util.List] and content type [text/plain;charset=utf-8]
于是,通过postman发送该请求,详细观察了下响应结果中的响应体和响应头,终于发现了些不一样的地方。首先,返回的结果是json格式的数据,但他却是文本类型。再去看看响应头,发现了其中一个响应头是content-type:text/plain;charset=utf-8。
也就是说,服务器响应回来的数据并不是json数据,这就导致了RestTemplate处理不了非json的响应数据。
如果服务器返回是json数据的话,那么响应头应该是这样的:content-type:application/json'charset=utf-8。
通过以上分析,最终确定的是RestTemplate处理不了当响应头content-type:text/plain;charset=utf-8时的数据,需要我们为RestTemaplate配置一下。
二、代码
解决方案:自定义一个消息装换器,让RestTemplate支持content-type:application/json'charset=utf-8的数据转换
/**
* RestTemplate配置类
*/
@Slf4j
@Configuration
public class RestTemplateConfig {
/**
* 常用远程调用RestTemplate
* @return restTemplate
*/
@Bean("restTemplate")
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
// 加入自定义信息转换
restTemplate.getMessageConverters().add(new MyMappingJackson2HttpMessageConverter());
return new RestTemplate();
}
/**
* 使RestTemplate支持转换类型为text/plain的数据
*/
public static class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter{
public MyMappingJackson2HttpMessageConverter(){
List<MediaType> mediaTypes = new ArrayList<>();
// 加入text/plain类型的支持
mediaTypes.add(MediaType.TEXT_PLAIN);
// 如果还有其他类型的需要装换,可以一一加上
setSupportedMediaTypes(mediaTypes);
}
}
}
至此,数据转换成功。
三、参考地址
更多推荐
所有评论(0)