一、问题出现

在使用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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐