SpringMvc返回@ResponseBody中文乱码

使用SpringMvc的@ResponseBody返回指定数据的类型做为http体向外输出,在浏览器里返回的内容里有中文,会出现乱码,项目的编码、tomcat编码等都已设置成utf-8,如下返回的是一个字符串中文乱码。

Java代码收藏代码

@RequestMapping("user/get_comment_list.do")

public@ResponseBodyStringgetUserCommentList(Integeruser_id,Bytetype){

HashMap<String,Object>map=newHashMap<String,Object>();

map.put("type",type);

map.put("user_id",user_id);

CommentActPojoactPojo=newCommentActPojo();

List<CommentInfo>list=this.bo.getComList(map);

actPojo.setComments(list);

//System.out.println("数据:"+JsonUtil.toJson(actPojo));//打印数据无中文乱码

returnJsonUtil.toJson(actPojo);

}

SpringMvc使用的版本是3.2.2,后来网上找了一些资料,在@RequestMapping里强制指定返回的数据类型和字符编码,中文乱码解决,如下:

Java代码收藏代码

@RequestMapping(value="user/get_comment_list.do",produces="application/json;charset=utf-8")

问题来了,如果项目里有很多类似这样的请求,每个请求都去配置produces,会很累赘且繁琐,查看了一下源代码,发现在spring处理ResponseBody时涉及到org.springframework.http.converter.StringHttpMessageConverter这个类,该类在默认实现中将defaultCharset设为ISO-8859-1。当@RequestMapping标记的方法未配置produces属性时,将自动使用默认编码;如果配置了produces属性,AbstractHttpMessageConverter中的write方法将不会受supportedMediaTypes影响,而用produce设置的header赋值给contenttype。改造一下RequestMappingHandlerAdapter的配置,springMvc.xml如下:

Java代码收藏代码

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.2.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

<!--必须放在<mvc:annotation-driven>之前-->

<beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

<propertyname="messageConverters">

<list>

<beanclass="org.springframework.http.converter.StringHttpMessageConverter">

<propertyname="supportedMediaTypes">

<list>

<value>text/plain;charset=UTF-8</value>

<value>text/html;charset=UTF-8</value>

<value>applicaiton/javascript;charset=UTF-8</value>

</list>

</property>

</bean>

</list>

</property>

</bean>

<!--扫描工程文件-->

<context:component-scanbase-package="com.tcl.club.core"/>

<context:component-scanbase-package="com.cus.back">

<context:exclude-filtertype="annotation"expression="org.springframework.stereotype.Service"/>

</context:component-scan>

<mvc:annotation-driven/>

<beanid="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

<!--对模型视图名称的解析,即在模型视图名称添加前后缀,在requestmapping输入的地址后自动调用该类进行视图解析-->

<beanid="viewResolver"

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<propertyname="viewClass"

value="org.springframework.web.servlet.view.JstlView"/>

<propertyname="prefix"value="/WEB-INF/view/"/>

<propertyname="suffix"value=".jsp"/>

</bean>

</beans>

上述springMvc.xml文件重新设置了StringHttpMessageConverter的编码方式,而不必在每个@RequestMapping里设置produces属性。如果返回的Jackson类型的数据,可以设置成如下:

Java代码收藏代码

<bean

class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

<propertyname="supportedMediaTypes">

<list>

<value>application/json;charset=UTF-8</value>

<value>application/x-www-form-urlencoded;charset=UTF-8</value>

</list>

</property>

</bean>

相关推荐