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