首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring Boot:解决中文乱码

Spring Boot:解决中文乱码

作者头像
HLee
修改2021-04-25 14:19:59
修改2021-04-25 14:19:59
8.8K1
举报
文章被收录于专栏:房东的猫房东的猫

简介

Spring Boot 2.3.1.RELEASE 解决中文乱码的三种方法。

近日项目将 Spring Boot 升级到了最新 2.3.1.RELEASE,发现接口返回内容的中文都是乱码

代码语言:javascript
复制
{"errorCode":0,"message":"操作成功"}

度娘了好久,发现大都是过时的方法,在 Spring Boot 2.3.1.RELEASE 中无效, 经过源码分析+实践,确定如下三种方法可以解决中文乱码,解决后结果如下:

代码语言:javascript
复制
{"errorCode":0,"data":null,"message":"操作成功"}

解决方法

方法一:设置全局的编码格式为UTF-8

application.yml中添加如下配置

代码语言:javascript
复制
server:
  servlet:
    encoding:
      charset: utf-8
      force: true
      enabled: true

参考官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#server-properties

方法二:继承 WebMvcConfigurationSupport

代码语言:javascript
复制
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

  @Override
  protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    for (HttpMessageConverter<?> converter : converters) {
      // 解决 Controller 返回普通文本中文乱码问题
      if (converter instanceof StringHttpMessageConverter) {
        ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
      }

      // 解决 Controller 返回json对象中文乱码问题
      if (converter instanceof MappingJackson2HttpMessageConverter) {
        ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
      }
    }
  }
}

原理可以参考如下源码:

代码语言:javascript
复制
/**
 * 这个方法为 RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver 提供了访问共享的 HttpMessageConverter 的能力
 * RequestMappingHandlerAdapter 的职责就包括对于 @RequestMapping 注解的解析处理能力
 * ExceptionHandlerExceptionResolver 的职责就包括对于 @ExceptionHandler 注解的解析处理能力
 */
protected final List<HttpMessageConverter<?>> getMessageConverters() {
  if (this.messageConverters == null) {
    this.messageConverters = new ArrayList<>();
    /*
     * 空方法,留给子类扩展
     * 通过这个方法可以添加自己的针对特定内容类型的实例,则可以达到优先级最高,等同于屏蔽掉列表中其他同类型实例
     */
    configureMessageConverters(this.messageConverters);
    if (this.messageConverters.isEmpty()) {
      // 添加默认的各种converter
      addDefaultHttpMessageConverters(this.messageConverters);
    }
    /*
     * 空方法,留给子类扩展
     * 可以针对框架自带的默认的各种类型的 HttpMessageConverter 实例进行一些属性上的自定义设置
     */
    extendMessageConverters(this.messageConverters);
  }
  return this.messageConverters;
}

方法三:设置 @RequestMapping 的 produces 属性

把 content-type 的 charset 设置为utf-8

代码语言:javascript
复制
@RequestMapping(value = "queryXXX", produces = "application/json;charset=UTF-8")

这种方法每个Controller都要加,比较麻烦,不推荐

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 解决方法
    • 方法一:设置全局的编码格式为UTF-8
    • 方法二:继承 WebMvcConfigurationSupport
    • 方法三:设置 @RequestMapping 的 produces 属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档