发现不少人碰到Spring RestTemplate 有中文乱码的问题,网上有两种解决办法:css
第一种,修改StringHttpMessageConverter类:html
StringHttpMessageConverter类,默认是的编码是ISO-8859-1:
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");java
把StringHttpMessageConverter这个类的源码中的
web
Charset.forName("ISO-8859-1");
改成
Charset.forName("utf-8");spring
编译后从新放在org.springframework.web-3.0.5.RELEASE.jar中json
这种办法我的不太喜欢。app
第二种:用配置方式,在你的app-context.xml中写入AnnotationMethodHandlerAdapte配置:ide
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 编码
<property name="messageConverters">
<list>
<bean class = "org.springframework.http.converter.StringHttpMessageConverter">
<property name = "supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>url
这个其实也有问题,不能从根本解决乱码,由于它只对服务端起做用,而RestTemplate不会用做用,毕竟RestTemplate 是一个client,必须保证client编码跟服务端接受的编码一致,不然仍是会出现乱码;
个人解决办法就是在app-context.xml里面配置好RestTemplate的messageConverters:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/x-www-form-urlencoded;charset=UTF-8</value> <value>multipart/form-data;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> <value>application/xml;charset=UTF-8</value> </list> </property> <property name="partConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> <value>multipart/form-data;charset=UTF-8</value> <value>application/xml;charset=UTF-8</value> </list> </property> </bean> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> </list> </property> </bean> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/plain;charset=UTF-8</value> <value>multipart/form-data;charset=UTF-8</value> <value>application/xml;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean>
其中的关键就是partConverters,对他里面的Converter进行编码的配置;
另外,在代码里面要用autowired的办法注入RestTemplate ,new RestTemplate的话仍是会用原来的partConverters 的配置。
@Autowired RestTemplate rt;