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


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


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




Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="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/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  6.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd  
  7.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">  
  8.   
  9.     <context:component-scan base-package="cn.netcluster.workflow.**" />  
  10.   
  11.     <mvc:annotation-driven />  
  12.   
  13.     <mvc:default-servlet-handler />  
  14.   
  15.     <bean  
  16.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
  17.         id="multipartResolver">  
  18.         <property name="defaultEncoding" value="UTF-8" />  
  19.         <property name="uploadTempDir" value="resources/attach/temp" />  
  20.     </bean>  
  21.   
  22. </beans>  


使用的是Spring3.1

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


解决的办法:

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

Java代码   收藏代码
  1. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  2.         <property name="messageConverters">  
  3.             <util:list>  
  4.                 <bean class="com.pcds.ecomm.website.syscustomization.ConfigurableStringHttpMessageConverter">  
  5.                     <constructor-arg value="UTF-8"/>  
  6.                 </bean>  
  7.                 <bean class="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.         <property name="messageConverters">  
  4.             <list>  
  5.                 <bean  
  6.                     class="org.springframework.http.converter.StringHttpMessageConverter">  
  7.                     <property name="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.         MediaType contentType = outputMessage.getHeaders().getContentType();  
  5.         Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;  
  6.         FileCopyUtils.copy(s, new OutputStreamWriter(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. public String getForm(HttpServletResponse response, String pid) {  
  4.     response.setContentType("text/html; charset=UTF-8");  
  5.     System.out.println(super.formService.getRenderedStartForm(pid)  
  6.             .toString());  
  7.     return "你好";  


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring中使用@ResponseBody注解返回结果时,可能会遇到中文乱码的问题。解决这个问题可以通过配置消息转换器来指定字符编码为UTF-8。 在代码中,可以添加如下配置来解决中文乱码问题: ```xml <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html; charset=UTF-8"/> <property name="defaultCharset" value="UTF-8"/> </bean> </mvc:message-converters> ``` 这段配置会将返回的字符串转换成UTF-8编码的字符。 另外,还可以在Spring配置文件中启用注解驱动的Spring MVC功能,这样也可以解决中文乱码的问题: ```xml <mvc:annotation-driven> <!-- 解决ResponseBody返回乱码 --> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html; charset=UTF-8"/> <property name="defaultCharset" value="UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven> ``` 这样配置后,@ResponseBody注解返回的结果就不会出现中文乱码的问题了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring+mybatis 通过@ResponseBody返回结果中文乱码的解决方法](https://download.csdn.net/download/weixin_38631225/12766950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [解决@ResponseBody注解返回中文乱码](https://blog.csdn.net/hh680821/article/details/104730498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值