`
jejoker
  • 浏览: 25390 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

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

 

!!补充:实际上,根据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优先级是最高的,可能这才是最好的解决办法。

分享到:
评论
1 楼 zhengyiwei 2016-11-15  
666666666

相关推荐

    spring3.2.4相关jar包

    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 3.2.4.RELEASE jar包

    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-...

    spring-framework-3.2.4-RELEASE Maven Source Code

    《Spring Framework 3.2.4-RELEASE Maven Source Code 深度解析》 Spring Framework作为Java开发领域的重要支柱,其3.2.4版本在当时具有广泛的影响力。本源码包“spring-framework-3.2.4-RELEASE”不仅包含了Spring...

    spring3.2.4全部jar

    3. **spring-webmvc-3.2.4.RELEASE.jar**:这部分是Spring的Web MVC框架,用于构建基于模型-视图-控制器架构的Web应用。它提供了灵活的控制器接口、模型-视图分离、数据绑定以及本地化支持,使得Web开发更为简洁高效...

    Spring-3.2.4源码+lib库

    java框架 Spring-3.2.4源码+lib库,直接分享给大家,不用到处找了。

    spring 3.2.4官网jar包

    3. **MVC(Model-View-Controller)**:Spring MVC 是Spring 框架中用于构建Web应用的一部分,提供了一个灵活的架构,支持RESTful风格的请求处理,模板引擎,以及视图解析。 4. **数据访问集成**:Spring 提供了对...

    spring framework 3.2.4 组件依赖关系及完整依赖包

    Spring Framework 3.2.4 是一个广泛应用的Java企业级应用程序开发框架,它提供了一整套服务,包括数据访问、事务管理、Web应用支持、面向切面编程(AOP)等。这个版本的Spring框架包含了多个核心组件和依赖库,以...

    Spring Framework 3.2.4.RELEASE API.chm

    Spring Framework 3.2.4.RELEASE API.chm

    struts2.3.24,hibernate4.3.6,spring4.0.6,spring security3.2.4包

    struts2.3.24,hibernate4.3.6,spring4.0.6,spring security3.2.4jar包的整合,如果不需要spring security,可以将带有spring secuirity的包全删掉

    SPRING3.2.4以及依赖包附加MONGODB相关驱动

    总的来说,这个压缩包为那些希望在Spring 3.2.4环境中使用MongoDB的开发者提供了一站式的解决方案,减少了配置和依赖管理的工作量。通过这些组件,开发者可以轻松地创建能够充分利用MongoDB特性的应用,例如进行高...

    spring-framework-3.2.4.RELEASE-dist.rar

    Spring Framework 3.2.4.RELEASE 是一个重要的版本,它是Spring生态系统的里程碑,为开发者提供了全面的Java应用程序开发支持,特别是针对企业级应用。这个版本包含了完整的文档、jar包、以及源代码,使得开发者可以...

    spring3.2.4

    10. **兼容性和稳定性**:Spring 3.2.4对已知问题进行了修复,并保持了与各种第三方库的良好兼容性,确保了应用的稳定运行。 这些jar文件包含了Spring框架3.2.4的所有组件和服务,包括核心容器、数据访问/集成、Web...

    spring3.2.4lib

    压缩包子文件的文件名称列表 "spring3.2.4lib" 可能包含了以下内容:Spring核心库、Spring MVC库、Spring AOP(面向切面编程)、Spring ORM(对象关系映射)、Spring JDBC(Java数据库连接)、Spring Test等模块的...

    spring3.2.4lib source

    《Spring 3.2.4源码库解析》 在软件开发领域,Spring框架作为Java企业级应用开发的基石,其重要性不言而喻。本文将深入探讨Spring 3.2.4版本的源码库,以帮助开发者更好地理解和运用这一强大的框架。 Spring框架是...

    Spring3.2.4开发jar包

    5. **MVC框架**:Spring MVC是Spring提供的用于构建Web应用的模块,它支持RESTful风格的URL设计,提供了视图解析、数据绑定等功能。在3.2.4版本中,对异步处理和模板引擎的支持进一步增强。 6. **交易管理**:...

    基于spring 3.2.4+mybatis+maven

    综上所述,这个项目展示了如何利用Spring 3.2.4、Spring MVC、MyBatis和Maven来搭建一个现代化的Java Web应用,通过RESTful API提供服务,并使用JUnit进行测试。每个组件都扮演着至关重要的角色,共同构建出一个功能...

    spring源码3.2.4

    总的来说,Spring3.2.4源码的学习涵盖了依赖注入、面向切面编程、Web开发、事务管理等多个重要领域,深入理解这些源码将有助于开发者更深入地掌握Spring框架,提高代码质量,解决实际问题。通过对`spring-framework-...

    spring-framework-3.2.4.RELEASE+aopalliance-alphal

    通过引入AOP Alliance的alpha版本,可能是在解决某些特定的AOP兼容性问题,或者是为新的功能或优化提供支持。这表明Spring社区对AOP Alliance的持续关注,以确保其与Spring的兼容性和最佳实践。 总结来说,Spring ...

    spring-framework-3.2.4.RELEASE 源码

    这里的"spring-framework-3.2.4.RELEASE"是Spring框架的一个特定版本,发布于2013年,是3.x系列中的一个稳定版本。这个版本在当时引入了许多增强功能和改进,包括对Java 7的支持、更好的类型安全性和其他性能优化。 ...

    Spring3.2.4 + Quartz2.2.0集成实例

    Spring3.2.4 + Quartz2.2.0集成实例 可参考http://blog.csdn.net/liangbinny/article/details/17284691

Global site tag (gtag.js) - Google Analytics