@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,也可通过替换完成。下篇文章说明。