首先请确保Spring版本为3.2.4
问题1:使用@ResponseBody注解,返回对象类型时,如Map,中文字符,在客户端会显示为???
解决办法:请检查依赖jar包,确保spring-context-support.jar的版本也是3.2.4,则可显示中文;
问题2:使用@ResponseBody注解,返回String时,中文字符,在客户端会显示为???,并且contextType中会缺失encoding值,即为text/html但是,没有后面的encode
解决办法:首先需要知道,在spring3.2以后,@RequestMapping使用了RequestMappingHandlerAdapter来处理请求,对于@ResponseBody,当为string时,会调用默认构造方法里面add的StringHttpMessageConverter,需要注意的是,这个converter默认的编码是“ISO-8859-1”,中文的大敌啊,而且这个converter是new出来的,因此无法采用替代注入的方式,而只能注入messageConverters,因此,我们需要重新申明一个RequestMappingHandlerAdapter,如下:
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <beans:property name="messageConverters"> <beans:list> <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"> <beans:constructor-arg value="UTF-8" /> <beans:property name="writeAcceptCharset" value="false"/> </beans:bean> <beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></beans:bean> <beans:bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></beans:bean> <beans:bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"></beans:bean> </beans:list> </beans:property> </beans:bean>
为什么除了StringHttpMessageConverter还有其他3个converter呢,因为默认RequestMappingHandlerAdapter构造函数是增加了4个converter的,如果不全写上,可能导致其他返回类型无法被转换,自己可以试试看,StringHttpMessageConverter有个writeAcceptCharset的设置,请自行查看源码。
重新定义了RequestMappingHandlerAdapter以后,中文能被正确写入到response,但是,默认情况下,客户端会看到response返回的contentType可能为"text/html",仍然没有编码显示,这时,需要主动设置response的encoding,或者采用filter。如果使用spring的CharacterEncodingFilter,请将forceEncoding设置为true。至此,客户端会看到contentType为 text/html;charset=UTF-8
!!补充:实际上,根据3.2.4文档可以看到,RequestMappingHandlerAdapter不仅add了以上默认的4个converter,而是更多,debug可以看到实际上是7个converter,这个是由mvc命名空间默认增加的,至于源码什么地方做的,我没找到。后来去看spring-mvc.xsd,学习到,annotation-driven标签下的message-converters可以直接替换或者增加converter,于是,我将自己做的StringHttpMessageConverter增加到了里面,而去掉了RequestMappingHandlerAdapter的bean,如下:
<annotation-driven> <message-converters> <!-- default StringHttpMessageConverter, solve encoding problem --> <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"> <beans:constructor-arg value="UTF-8" /> <beans:property name="writeAcceptCharset" value="false" /> </beans:bean> </message-converters> </annotation-driven>
这可能是更好的解决办法,但是,现在converter就会变成8个,会有2个String的converter存在,目前测试没问题,自己做的converter优先级是最高的,可能这才是最好的解决办法。
相关推荐
java spring3.2.4 jar包 spring-aop-3.2.4.RELEASE spring-aspects-3.2.4.RELEASE spring-beans-3.2.4.RELEASE spring-build-src-3.2.4.RELEASE spring-context-3.2.4.RELEASE ...spring-webmvc-portlet-3.2.4.RELEASE
spring-webmvc-3.2.4.RELEASE.jar spring-jdbc-3.2.4.RELEASE.jar spring-tx-3.2.4.RELEASE.jar spring-context-support-3.2.4.RELEASE.jar spring-orm-3.2.4.RELEASE.jar spring-jms-3.2.4.RELEASE.jar spring-...
spring3.2.4全部jar,spring3.2.4全部jar,spring3.2.4全部jar
本项目是一个maven工程,基于spring mvc 3.2.4+mybatis. spring mvc 为rest风格 已经实现junit 4测试 穷啊,要2分了。
java框架 Spring-3.2.4源码+lib库,直接分享给大家,不用到处找了。
这是我从官网上下载的最新jar包,分享给大家!
Spring Framework 3.2.4.RELEASE API.chm
struts2.3.24,hibernate4.3.6,spring4.0.6,spring security3.2.4jar包的整合,如果不需要spring security,可以将带有spring secuirity的包全删掉
含有spring framework 3.2.4各组件依赖包jar文件及依赖关系说明文档
Spring3.2.4 + Quartz2.2.0集成实例 可参考http://blog.csdn.net/liangbinny/article/details/17284691
spring3.2.4源码
spring3.2.4 lib的source lib
因为Spring 3.0以上的版本把第三方的jar包分离出来了,如commons-logging.jar,commons-dbcp-1.3.jar,com.springsource.org.aopalliance-1.0.0.jar,aspectjweaver-1.7.4.ja,aspectj-1.7.4.jarr等。特别不适合初学者...
spring 3.2.4的所有jar文件
这是我自己收集的spring3.2.4的核心源码包,里面包含了spring所需要的绝大部分的包而且是源码,需要的同学可以下下去看看,有源码在手的话,查东西很方面,我用的很顺手,所以拿出来和大家分享,希望对你们有用。
spring-orm-3.2.4.RELEASE.jar,ssh整合的时候用的上。
Spring3.2.4.zip中是Spring项目的各种Jar包
spring-framework-3.2.4.RELEASE-API 方便实用,分享给大家,最新版
spring开发包3.2.4
SPRING3.2.4以及依赖包附加MONGODB相关驱动,绝对齐全能用