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")));

 

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