现在看来,上一次讨论这个话题的解决方案基本是治标不治本,没什么实际效用。现在的4.1.6版本就完全失效了。
新增两个解决方案:
1.重写StringHttpMessageConverter类,只要在spring源码中找到这个类的java文件,拷贝到工程下原样新建一个(原来的包路径,原来的类名称),利用java包覆盖机制,将引用库jar包中原来的类覆盖掉就可以。
在源码中将
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
替换为:
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
2.在spring配置文件中新建一个StringHttpMessageConverter供需要它对象引用,唯一注意的是要在构造函数中将UTF-8字符集传进去。网上关于这个似乎很多都是用字符串传进去的,貌似Charset无法用字符串直接构造对象,因此必须先构建出一个Charset给StringHttpMessageConverter的构造函数引用。配置xml片段如下:
<bean name="utf8Charset" class="java.nio.charset.Charset" factory-method="forName" >
<constructor-arg value="UTF-8" ></constructor-arg>
</bean>
<bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg ref="utf8Charset">
</constructor-arg>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven >
<mvc:message-converters>
<bean
class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg ref="utf8Charset">
</constructor-arg>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/x-www-form-urlencoded;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
上述两个途径都已实际验证过。参数了如下文档:http://my.oschina.net/alexgaoyh/blog/316314
RestTemplate中文乱码的道理是一样的。