@value 乱码_@ResponseBody 总是乱码?这个问题得好好捋一捋!

f9954f6bc2e0471a0826f5a4761315a9.png

本文作者:忧郁的马赛克

本文地址:http://1t.click/cDY


关于乱码问题,松哥之前有过一篇文章和大家分享:

  1. JavaWeb 乱码问题终极解决方案!

在这篇文章的最后,松哥提了一句,“还有一些非常偶尔的情况可能会用到 @RequestMapping 注解中的 produces 属性”,但是对于这个问题并没有展开讲,有的小伙伴可能还是会遇到这个问题,因此今天就来说一说这个话题。

问题背景

本文并不是介绍 @ResponseBody 注解,也不是中文乱码问题的大汇总笔记,这些网上都有很多内容了。这边仅对几年前,一个卡壳了挺久时间的问题的解决过程做一个记录,以警惕自己,达到自醒得目的。  

@ResponseBody 注解不用多介绍了,用过 SpringMVC 的同学都很熟了, @ResponseBody 将内容或对象作为 HTTP 响应正文返回,使用 @ResponseBody 将会跳过视图处理部分,而是调用适合的 HttpMessageConverter ,将返回值写入输出流。在日常工作中,通常使用封装好的 ViewModel 进行后台数据的返回,一切正常。但一次在使用 @ResponseBody 进行返回 String 数据的时候,竟会出现中文乱码。

编程的过程免不了遇到各种问题,而遇到问题然后解决问题的这个过程我认为是最让人兴奋的事情。越棘手的问题,解决以后带来的快感也越大(PS:当然解决不了的话,就会越烦躁。。),还是言归正传,谈一下解决错误的过程。

问题分析

最早我一直以为 Spring 配置一下编码过滤器就可以解决任何中文乱码问题,恩,确实一直是这样设置着,然并卵,代码如下

characterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceRequestEncoding

true

forceResponseEncoding

true

characterEncodingFilter

/*

直接返回 String 会乱码,而返回 ViewAndModel 的那个不会乱码,这是为什么?

其实也可以说是 SpringMVC 的一个 bug ,SpringMVC 有一系列 HttpMessageConverter 去处理用 @ResponseBody 注解的返回值,如返回 VM 则使用 MappingJacksonHttpMessageConverter 或者其他的 HttpMessageConverter ,若返回 String ,则使用 StringHttpMessageConverter ,这个 convert 使用的是字符集是 iso-8859-1 ,而且是 final 的,部分源码如下:

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

既然是 String 有问题,那自然就直接从适配器 AnnotationMethodHandlerAdapter 的字符串解析器 StringHttpMessageConverter 入手,设置编码类型即可?NO!

class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">

name="messageConverters">

class="org.springframework.http.converter.StringHttpMessageConverter">

name="supportedMediaTypes">

text/plain;charset=UTF-8

那万金油 response.setContentType("text/html; charset=UTF-8"); 呢?NO!

那么重写 StringHttpMessageConverter 应该可以了吗?NO!

上面方法都不行,就尝试着各种百度,说法多种多样,但答案还是:NO!

问题解决

看来我们得从源头开始再理一遍,既然问题在解析器,那么可以从配置文件配置解析器入手。mvc-config.xml 文件从上到下:控制层扫描、国际化配置、文件上传表单解析器、自定义拦截器、视图配置。好像都不是,继续往下,一些 HandlerMapping 和 HandlerAdapter ,还有一句

网上查阅了一下资料,果然发现问题其实就在这句

/> 是一种简写模式,它会自动注册 DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter 两个 bean ,是 SpringMVC@Controller 分发请求所必须的,并且提供了其他一些支持。

上面使用为 StringHttpMessageConverter 设置编码模式其实正常是有效的,但是在使用了 语句后,再次显示声明其他 bean ,可能就无效了。

class="org.springframework.http.converter.StringHttpMessageConverter">

value="UTF-8" />

扩展:其他解决方案

除了使用上面那种方案之外,还可以使用下面的: 

  1. 完全不使用 String 返回,直接都通过统一的 ViewAndModel 去返回,如 ResultModel 等(正常也是这么干的,总还要错误信息等吧);

  2. 通过 @RequestMapping 的属性处理,该注解的属性 produces 用于指定返回的内容类型,这算肯定可以了,代码如下:

@RequestMapping(value="/test", method=RequestMethod.POST, produces="text/html;charset=UTF-8")

注意:既然使用了配置 ,还是建议在该配置内部进行处理。

好了,大家有没有 Get 到知识点呢?

19489dca8a746a38322c012404a4e0d7.png

●数据库分库分表,分片配置轻松入门!

●前后端分离时代,Java 程序员的变与不变!

●前后端分离开发思路探讨

●分布式数据库中间件 MyCat 搞起来!

●What?Tomcat 竟然也算中间件?

●我的第一本书,被选作大学教材了!

●北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!

●MySQL 只能做小项目?松哥要说几句公道话!

●松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸!

●干货|最新版 Spring Boot2.1.5 教程+案例合集

47f68530abc1bdd4584c2e9b98adeb25.png

2b408702b9f5b41a9cae45c38abb8a72.png你点的每个在看,我都认真当成了喜欢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值