Spring MVC 3.2.4 ResponseBody 编码问题解决
首先请确保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
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐