一、问题出现
在使用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);
}
}
}
至此,数据转换成功。
三、参考地址
restTemplate 请求头text/plain;charset=UTF-8_言之情的博客-CSDN博客https://blog.csdn.net/Daegeum/article/details/119895172?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165096140816782395343197%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165096140816782395343197&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-119895172.142%5Ev9%5Epc_search_result_cache,157%5Ev4%5Econtrol&utm_term=RestTemplate%E6%8E%A5%E6%94%B6%E5%88%B0%E5%A4%B4%E4%B8%BAtext%2Fplain&spm=1018.2226.3001.4187