`
duoerbasilu
  • 浏览: 1479465 次
文章分类
社区版块
存档分类
最新评论

@ResponseBody 返回乱码 的完美解决办法 详解 (值得收藏)

 
阅读更多


返回结果“??”
Java代码 收藏代码
  1. @RequestMapping(value="/getForm")
  2. @ResponseBody
  3. publicStringgetForm(Stringpid){
  4. return"你好";
  5. }


返回结果“你好”
Java代码 收藏代码
  1. @RequestMapping(value="/getForm")
  2. @ResponseBody
  3. publicList<String>getForm(Stringpid){
  4. returnnewArrayList<String>(){{
  5. add("你好")
  6. }};
  7. }




Java代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  6. http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.1.xsd
  7. http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
  8. <context:component-scanbase-package="cn.netcluster.workflow.**"/>
  9. <mvc:annotation-driven/>
  10. <mvc:default-servlet-handler/>
  11. <bean
  12. class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
  13. id="multipartResolver">
  14. <propertyname="defaultEncoding"value="UTF-8"/>
  15. <propertyname="uploadTempDir"value="resources/attach/temp"/>
  16. </bean>
  17. </beans>


使用的是Spring3.1

问题补充:
xiaoZ5919 写道
你遇到的是第一个方法直接返回String会乱码,而返回list的那个不会乱码是吧?
这可以说是spring mvc的一个bug,spring MVC有一系列HttpMessageConverter去处理用@ResponseBody注解的返回值,如返回list则使用MappingJacksonHttpMessageConverter,返回string,则使用StringHttpMessageConverter,这个convert使用的是字符集是iso-8859-1,而且是final的
Java代码 收藏代码
  1. publicstaticfinalCharsetDEFAULT_CHARSET=Charset.forName("ISO-8859-1");


解决的办法:

你自己重写一个StringHttpMessageConverter,使用你想要的字符集,并且使这个属性可注入

Java代码 收藏代码
  1. <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  2. <propertyname="messageConverters">
  3. <util:list>
  4. <beanclass="com.pcds.ecomm.website.syscustomization.ConfigurableStringHttpMessageConverter">
  5. <constructor-argvalue="UTF-8"/>
  6. </bean>
  7. <beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
  8. </util:list>
  9. </property>
  10. </bean>


另外一种直接放弃String,而是使用对象


我之前是这样写的,也没有用
Java代码 收藏代码
  1. <bean
  2. class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  3. <propertyname="messageConverters">
  4. <list>
  5. <bean
  6. class="org.springframework.http.converter.StringHttpMessageConverter">
  7. <propertyname="supportedMediaTypes">
  8. <list>
  9. <value>text/plain;charset=UTF-8</value>
  10. </list>
  11. </property>
  12. </bean>
  13. <bean
  14. class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
  15. </list>
  16. </property>
  17. </bean>


问题补充:
xiaoZ5919 写道
Java代码 收藏代码
  1. if(writeAcceptCharset){
  2. outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
  3. }
  4. MediaTypecontentType=outputMessage.getHeaders().getContentType();
  5. Charsetcharset=contentType.getCharSet()!=null?contentType.getCharSet():DEFAULT_CHARSET;
  6. FileCopyUtils.copy(s,newOutputStreamWriter(outputMessage.getBody(),charset));

兄弟我一直都设置了这个
Java代码 收藏代码
  1. <filter>
  2. <filter-name>CharacterEncodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>CharacterEncodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

问题补充:
xiaoZ5919 写道
兄弟 也许我没有说清楚,
需要设置的是response.setContentType("text/html; charset=UTF-8")
而不是response.setCharacterEncoding(this.encoding);

你看看我贴的代码就知道了

Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;

那个filter里面设置的是

response.setCharacterEncoding(this.encoding);

不过我觉得这不是一个好的办法

最好的办法还得是重写一个StringHttpMessageConverter,使其能灵活配置charset

xiaoZ5919 写道
兄弟 也许我没有说清楚,
需要设置的是response.setContentType("text/html; charset=UTF-8")
而不是response.setCharacterEncoding(this.encoding);

你看看我贴的代码就知道了

Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;

那个filter里面设置的是

response.setCharacterEncoding(this.encoding);

不过我觉得这不是一个好的办法

最好的办法还得是重写一个StringHttpMessageConverter,使其能灵活配置charset


兄弟还是不行哦
Java代码 收藏代码
  1. @RequestMapping(value="/getForm")
  2. @ResponseBody
  3. publicStringgetForm(HttpServletResponseresponse,Stringpid){
  4. response.setContentType("text/html;charset=UTF-8");
  5. System.out.println(super.formService.getRenderedStartForm(pid)
  6. .toString());
  7. return"你好";
  8. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics