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