在spring mvc 中,通过ajax访问controller通常希望访问json对象,难免会遇到返回中文。
@RequestMapping("/test")
@ResponseBody
public String test(){
return "Spring中文乱码问题";
}
如果直接这样返回,你会发现客户端取出的是乱码,遇到问题,我第一想法就是ResponseBody里面是否有参数设置编码,百度发现,spring没有提高设置编码,产生乱码的问题是spring默认使用的是ISO-8859-1.
<pre name="code" class="java">public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
此代码在org.springframework.http.converter.StringHttpMessageConverter类中,此类继承了AbstractHttpMessageConverter抽象类,那就复制StringHttpMessageConverter写了一个UTF8ResponseBodyConverter,把这句改成了
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
在spring-mvc.xml中增加如下配置:
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="com.common.converter.UTF8ResponseBodyConverter" />
</list>
</property>
</bean>
本以为这样设置就可以解决中文乱码问题了,可是不行,又百度,http://blog.csdn.net/wuxinzaiyu/article/details/8813974,博客中说配置需要 写在controller的扫描配置之前,我这样设置了,但还是不行,可能是我的项目配置中有多个xml配置。
这种配置跟配置位置有关,个人觉得不好,不过给了提示,既然配置需要写在controller扫描配置之前,那为什么不能配置在<mvc:annotation-driven/>配置,又问百度,发现真的可以,配置如下:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
终于解决了,但是发现spring这点真不好配置啊,为了用@ResponseBody,解决中文麻烦,还不如直接PirntWriter输出,直接设置response参数就可以了。