RestTemplate重新配置StringHttpMessageConverter后引发HttpMessageNotReadableException

springboot中按照如下方式配置并使用RestTemplate:

//将restTemplate注入spring容器
@Bean("restTemplate")
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        RestTemplate restTemplate = builder.build();
        restTemplate.setRequestFactory(clientHttpRequestFactory());
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
        while (iterator.hasNext()) {
            HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof StringHttpMessageConverter) {
                // 注释一:先删除StringHttpMessageConverter
                iterator.remove();
            }
        }
        // 注释二:再添加中文解码的转换器,此处为错误配置示例***
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }

以上方式在部分状况下能正常使用,是因为HttpMessageConverterExtractor.extractData(ClientHttpResponse response)方法中使用MappingJackson2HttpMessageConverter能够正确解析Response中的json串,但一旦只能用StringHttpMessageConverter解析时就会抛出如下异常(HttpMessageNotReadableException):

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT toke

此时仅需要把第一段代码中的【注释二】后的代码修改如下即可,原因:RestTemplate.messageConverters中的元素是有序的

messageConverters.add(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章