發現很多人碰到Spring RestTemplate 有中文亂碼的問題,網上有兩種解決辦法:
第一種,修改StringHttpMessageConverter類:
StringHttpMessageConverter類,默認是的編碼是ISO-8859-1:
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
把StringHttpMessageConverter這個類的源碼中的
Charset.forName("ISO-8859-1");
改爲
Charset.forName("utf-8");
編譯後重新放在org.springframework.web-3.0.5.RELEASE.jar中
這種辦法個人不太喜歡。
第二種:用配置方式,在你的app-context.xml中寫入AnnotationMethodHandlerAdapte配置:
<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>
這個其實也有問題,不能從根本解決亂碼,因爲它只對服務端起作用,而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;