Spring @ResponseBody 返回乱码 的优雅解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]

返回的结果中,中文全部被问号(?)代替的解决办法:

*-servlet.xml的部分配置如下:

[html] view plain copy

  1. <bean id="utf8Charset" class="java.nio.charset.Charset"
  2. factory-method="forName">
  3. <constructor-arg value="UTF-8"/>
  4. </bean>
  5. <mvc:annotation-driven>
  6. <mvc:message-converters>
  7. <bean class="org.springframework.http.converter.StringHttpMessageConverter">
  8. <constructor-arg ref="utf8Charset" />
  9. </bean>
  10. </mvc:message-converters>
  11. </mvc:annotation-driven>

思路非常简单:查看StringHttpMessageConverter可知其有两个构造函数,

[java] view plain copy

  1. public StringHttpMessageConverter() {
  2. this(DEFAULT_CHARSET);
  3. }

[java] view plain copy

  1. public StringHttpMessageConverter(Charset defaultCharset) {
  2. super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
  3. this.defaultCharset = defaultCharset;
  4. this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
  5. }

这里采用第二个构造函数向其中注入我们的utf8Charset

上面配置会覆盖 mvc:annotation-driven 默认配置的StringHttpMessageConverter,其余的MessageConverter应该不会受到影响。

具体文档描述如下:

[html] view plain copy

  1. Element : message-converters
  2. Configures one or more HttpMessageConverter types to use for converting @RequestBody method parameters and
  3. @ResponseBody method return values. Using this configuration element is optional. HttpMessageConverter
  4. registrations provided here will take precedence over HttpMessageConverter types registered by default. Also see
  5. the register-defaults attribute if you want to turn off default registrations entirely.

<mvc:annotation-driven>会默认配置一些HttpMessageConverter,Spring Reference描述如下:

[html] view plain copy

  1. HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods.
  2. This is the complete list of HttpMessageConverters set up by mvc:annotation-driven:
  3. ByteArrayHttpMessageConverter converts byte arrays.
  4. StringHttpMessageConverter converts strings.
  5. ResourceHttpMessageConverter converts to/from org.springframework.core.io.Resource for all media types.
  6. SourceHttpMessageConverter converts to/from a javax.xml.transform.Source.
  7. FormHttpMessageConverter converts form data to/from a MultiValueMap<String, String>.
  8. Jaxb2RootElementHttpMessageConverter converts Java objects to/from XML — added if JAXB2 is present on the classpath.
  9. MappingJackson2HttpMessageConverter (or MappingJacksonHttpMessageConverter) converts to/from JSON — added if Jackson 2 (or Jackson) is present on the classpath.
  10. AtomFeedHttpMessageConverter converts Atom feeds — added if Rome is present on the classpath.
  11. RssChannelHttpMessageConverter converts RSS feeds — added if Rome is present on the classpath.

返回的结果中,中文全部是乱码(非问号)的解决办法:

在web.xml中加入以下Filter:

[html] view plain copy

  1. <filter>
  2. <filter-name>encodingFilter</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>encodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

时间: 2024-11-05 13:37:58

Spring @ResponseBody 返回乱码 的优雅解决办法的相关文章

SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱码 @RequestMapping(params = "method=submit") public String submit(HttpServletRequest request, ModelMap modelMap) throws Exception{ String uname =

get/post时中文乱码问题的解决办法

常有的方法,get请求用在tomcat的编码改为utf-8 即可 post 过滤器就可以 一.常识了解 1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码: 3.getBytes() 是通过平台默认字符集进行编码: 二.中文乱码出现 在学习任何一门技术时,经常会有初学者遇到中文乱码问题,比如MySQL,是因为在安装时没有设置:而在Servlet中

四个常见html网页乱码问题及解决办法

四个常见html网页乱码问题及解决办法 上周同事在做网页时,遇到网页打开之后都是乱码,同事很迷茫了,不知道该怎么解决,下面是小编抽时间把比较常见的html网页乱码问题及解决办法整理分享给大家. 其实导致网页乱码主要有几个原因,以下给出解决方法. 1.HTML的字符编码问题 该问题较常见,也是最明显和最容易解决的. 在网页<head>中加上: <meta http-equiv="Content-Type" Content="text/html;charset=

windows和linux下读取文件乱码的终极解决办法!

乱码是个很恶心的问题. windows和linux读取txt文件,一旦读取了,编码发生改变,就无法再还原了,只有重启项目. 网上有很多方法都是读取文件头,方法很好,但是亲测都不能用(右移8位判断0xff的,取3个字节的-1,-2的,大体上网上最多就这两种). 后来偶然发现一个方法,CharsetPrinter. 这个方法需要引入jar包,非常好用. public static String guessEncoding(String filename) { try { CharsetPrinter

Spring @ResponseBody 返回中文乱码问题

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt102 今天在使用spring 的时候,发现中文返回的是乱码. 经过研究发现,主要是@ResponseBody 引起的.主要是由于 @ResponseBody 返回字符串结果的时候,使用了org.springframework.http.converter.StringHttpMessageConverter 中默认的编码. 请看 org.springframework.ht

linux中的sqlplus显示乱码和方向键解决办法

linux中的sqlplus显示乱码解决办法 1.临时解决: export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" 2.永久生效 echo 'export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"'>>/etc/profile linux中的sqlplus退格和方向键的显示问题解决办法 stty erase ^H echo 'stty erase ^H'&g

eclipse中文乱码问题的解决办法

今天下午纠结这个乱码问题.简直要醉了. 网上有很多类似的问题,类似的解决办法. 至于有效性,其实也多为一个运气.因为谁知道eclipse的编码机制呢. 导入别人的项目,难免遇到几个中文汉字.真遇到怎么办呢. 1. 先检查原.zip或.tar文件是否受损.办法:解压后,用记事本打开.java文件.无乱码说明该文件未受损.可另存为,查看它的编码方式A(utf-8或其他). 2. 导入包后,jre环境配置好后,右击项目查看其默认编码方式(一般utf-8或gbk). 3. 若.java文件打开有乱码出现

codeblocks中文乱码原因及解决办法

原因:(本地化做得不够好)默认情况下codeblocks编辑器保存源文件是保存为windows本地编码,就是WINDOWS-936字符集,即GBK:但CB的编辑器在默认编辑的时候是按照UTF-8来解析的,由于源文件的编码与编辑器的编码没有统一好,从而造成代码中的中文字符乱码. 解决办法:只要将源文件的编码与编辑器的解析编码统一即可,具体步骤如下①setting→editor→encoding setting→选择WINDOWS-936与As default encoding ②setting→c

jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法

序列化中文时之所以乱码是因为.serialize()调用了encodeURLComponent方法将数据编码了 解决方法就是进行解码 原因:.serialize()自动调用了encodeURIComponent方法将数据编码了 解决方法:调用decodeURIComponent(XXX,true);将数据解码 //商品标签function tag(url){ var form = $('form').serialize(); //序列化内容 var shuju = decodeURICompon