`
assen
  • 浏览: 60212 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SpringMvc返回@ResponseBody中文乱码

阅读更多
使用SpringMvc的@ResponseBody返回指定数据的类型做为http体向外输出,在浏览器里返回的内容里有中文,会出现乱码,项目的编码、tomcat编码等都已设置成utf-8,如下返回的是一个字符串中文乱码。
@RequestMapping("user/get_comment_list.do")
	public @ResponseBody String getUserCommentList(Integer user_id,Byte type){
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("type", type);
		map.put("user_id", user_id);
		CommentActPojo actPojo = new CommentActPojo();
		List<CommentInfo> list = this.bo.getComList(map);
		actPojo.setComments(list);
		//System.out.println("数据:"+JsonUtil.toJson(actPojo));//打印数据无中文乱码
		return JsonUtil.toJson(actPojo);
	}


SpringMvc使用的版本是3.2.2,后来网上找了一些资料,在@RequestMapping里强制指定返回的数据类型和字符编码,中文乱码解决,如下:
@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如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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>之前 -->	
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
        <property name="messageConverters">  
            <list>  
                <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>
                            <value>applicaiton/javascript;charset=UTF-8</value>  
                        </list>  
                    </property>  
                </bean>  
            </list>  
        </property>  
    </bean>
	
	<!-- 扫描工程文件 -->
	<context:component-scan base-package="com.tcl.club.core" />
    <context:component-scan base-package="com.cus.back" >
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>
	
	<mvc:annotation-driven />

	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
	
	
	<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀,在requestmapping输入的地址后自动调用该类进行视图解析 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/WEB-INF/view/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
</beans> 


上述springMvc.xml文件重新设置了StringHttpMessageConverter的编码方式,而不必在每个@RequestMapping里设置produces属性。如果返回的Jackson类型的数据,可以设置成如下:
<bean  
       class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
       <property name="supportedMediaTypes">  
           <list>  
               <value>application/json; charset=UTF-8</value>  
               <value>application/x-www-form-urlencoded; charset=UTF-8</value>  
           </list>  
       </property>  
</bean> 
0
1
分享到:
评论
2 楼 endual 2016-05-04  
转下,确实如此。
1 楼 hae 2016-05-04  
我也遇到过返回String乱码的问题,我的解决是返回一个Map或者Dto也可以解决

相关推荐

Global site tag (gtag.js) - Google Analytics