@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
RestTemplate restTemplate = new RestTemplate(factory);
List<HttpMessageConverter<?>>messageConverters =
restTemplate.getMessageConverters();
Iterator<HttpMessageConverter<?>> iterator=messageConverters.iterator();
while(iterator.hasNext()){
HttpMessageConverter<?> converter=iterator.next();
//原有的String是ISO-8859-1编码 去掉
if(converter instanceof StringHttpMessageConverter){
iterator.remove();
}
}
messageConverters.add(new StringHttpMessageConverter(Charset.forName("utf-8")));
return restTemplate;
}
我们来看下RestTemplate 构造方法的源码
/**
* Create a new instance of the {@link RestTemplate} using default settings.
* Default {@link HttpMessageConverter}s are initialized.
*/
public RestTemplate() {
this.messageConverters.add(new ByteArrayHttpMessageConverter());
this.messageConverters.add(new StringHttpMessageConverter());
this.messageConverters.add(new ResourceHttpMessageConverter(false));
this.messageConverters.add(new SourceHttpMessageConverter<>());
this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
this.messageConverters.add(new AtomFeedHttpMessageConverter());
this.messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jackson2XmlPresent) {
this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
}
else if (jaxb2Present) {
this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jackson2Present) {
this.messageConverters.add(new MappingJackson2HttpMessageConverter());
}
else if (gsonPresent) {
this.messageConverters.add(new GsonHttpMessageConverter());
}
else if (jsonbPresent) {
this.messageConverters.add(new JsonbHttpMessageConverter());
}
if (jackson2SmilePresent) {
this.messageConverters.add(new MappingJackson2SmileHttpMessageConverter());
}
if (jackson2CborPresent) {
this.messageConverters.add(new MappingJackson2CborHttpMessageConverter());
}
}
初始化RestTemplate默认初始化了几个 MessageConverter ,不过StringHttpMessageConverter 默认使用的是ISO_8859_1编码,我们只需移除旧的,初始化新的UTF-8的StringHttpMessageConverter,设置进去就行。
同理,如果我们不需要使用默认的json转换器,想使用国产的FASTJSON,也可通过替换完成。下篇文章说明。