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,如下:

 

	
		
			
				
					
					
				
				
				
				
			
			
		
	

 为什么除了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推荐
  • —软件人才免语言低担保 赴美带薪读研!—



你可能感兴趣的:(spring,mvc,responsebody)