一、问题出现
在使用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);
}
}
}
至此,数据转换成功。
三、参考地址
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99685.html