@spring version 4.2.3
- RestTemplate 实例化时需要HTTPMessageConverters
RestTemplate(List<HttpMessageConverter<?>> messageConverters)
Create a new instance of the RestTemplate using the given list of HttpMessageConverter to use
- 因我需要HTTPMessageConverters的实现类:StringHttpMessageConverter,所以接下来是用这个来举例,先给几个HTTPMessageConverters的实现类,官网上也有说明:
All Known Implementing Classes:
AbstractGenericHttpMessageConverter, AbstractHttpMessageConverter, AbstractJackson2HttpMessageConverter, AbstractJaxb2HttpMessageConverter, AbstractWireFeedHttpMessageConverter, AbstractXmlHttpMessageConverter, AllEncompassingFormHttpMessageConverter, AtomFeedHttpMessageConverter, BufferedImageHttpMessageConverter, ByteArrayHttpMessageConverter, FormHttpMessageConverter, GsonHttpMessageConverter, Jaxb2CollectionHttpMessageConverter, Jaxb2RootElementHttpMessageConverter, MappingJackson2HttpMessageConverter, MappingJackson2XmlHttpMessageConverter, MarshallingHttpMessageConverter, ObjectToStringHttpMessageConverter, ProtobufHttpMessageConverter, ResourceHttpMessageConverter, RssChannelHttpMessageConverter, SourceHttpMessageConverter, StringHttpMessageConverter, XmlAwareFormHttpMessageConverter
- 记下来说StringHttpMessageConverter
见官网:
Constructor Summary
Constructors
Constructor and Description
StringHttpMessageConverter()
A default constructor that uses "ISO-8859-1" as the default charset.
StringHttpMessageConverter(Charset defaultCharset)
A constructor accepting a default charset to use if the requested content type does not specify one
有两个构造函数,如果使用第一个,spring默认使用第一个,那么我们编码就是ISO,
所以我们需要使用第二个。
- 先用传统代码来实现:
import java.nio.charset.Charset;
import java.util.List;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import com.google.common.collect.Lists;
public class RestTemplateCover extends RestTemplate{
public RestTemplateCover() {
List<HttpMessageConverter<?>> messages = Lists.newArrayList();
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
messages.add(converter);
this.setMessageConverters(messages);
}
}
spring servlet.xml中加入:
<bean id = "restTemplate" class="xxx.xxx.xx.RestTemplateCover"></bean>
- 但是这种方式太麻烦,还要改了然后再加入。何不必直接使用xml(其实真实原因是因为本人xml不行,下面的xml配置弄了半天才出来的):
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg type="java.nio.charset.Charset">
<value>UTF-8</value>
</constructor-arg>
</bean>
</list>
</property>
</bean>
总结
经过这次对这个RestTemplate乱码问题的处理,对问题处理的认知也有了自己的想法。
1.不要急,先百度下,如果百度不到,翻看源码。
2.翻看源码,仔细的观察会使什么原因导致的。比如这次是因为charset导致的。我们在看RestTemplate的时候很轻易的可以找到messageConverters是导致乱码的原因(总共就几个构造函数)。
http://docs.spring.io/spring/docs/current/javadoc-api/
从HttpMessageConverter的实现类中选取自己需要的: StringHttpMessageConverter。
它的构造函数有设置编码的方法。从而达到目的。知识积累:
某类用构造函数,而我们需要对有参数的进行注入:
<bean class="xxx.java">
<constructor-arg value="xxx"/>
</bean>