springboot @ConfigurationProperties 中文乱码解决方案

springboot @ConfigurationProperties 中文乱码解决方案

================================

©Copyright 蕃薯耀 2021-12-22

https://www.cnblogs.com/fanshuyao/

一、springboot @ConfigurationProperties 中文乱码问题

版本:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/>
    </parent>

1、application.properties文件:

lqy.java.auto.id=10
lqy.java.auto.name=张三aa
lqy.java.auto.map.a=a-一
lqy.java.auto.map.b=b-二

2、读取配置文件类

 
import java.util.Map;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
 
@ConfigurationProperties(prefix = "lqy.java.auto", ignoreUnknownFields = true)
public class MyProperties {
 
    private Integer id;
    private String name;
    private Map<String, String> map;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    
    
}

3、加载出来,出现中文乱码

myProperties = {
    "name":"å¼\u00a0ä¸\u0089aa",
    "id":10,
    "map":{"a":"a-ä¸\u0080","b":"b-äº\u008c"}
}

二、springboot @ConfigurationProperties 中文乱码解决方案

方案一:转成ASCII码

将中文全部转成ASCII码

详情略。

方案二:覆盖OriginTrackedPropertiesLoader

覆盖原文件:org.springframework.boot.env.OriginTrackedPropertiesLoader

将OriginTrackedPropertiesLoader所有代码复制出来,按照包路径建立自己的包和类(包名和类名都必须和原来的一致,不然不生效)

如下图所示:

 

然后修改自己的OriginTrackedPropertiesLoader上的编码:

原来是:

 

修改后是:StandardCharsets.UTF_8

CharacterReader(Resource resource) throws IOException {
            this.reader = new LineNumberReader(
                    new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8));
        }

重启项目,发现项目中文乱码已经解决。

myProperties = {"name":"张三aa","id":10,"map":{"a":"a-一","b":"b-二"}}
User u = {"name":"张三aa","id":10}

方案三:使用yml文件

使用yml文件也没有中文乱码。

application.yml:

lqy: 
  java:
    auto:
      id: 11
      name: 李四ll
      map:
        aa: map一
        bb: map二

同时使用application.yml和application.properties,application.properties会覆盖application.yml

方案四:自定义配置文件

1、自定义配置文件:custom.properties

 
lqy.java.my.id=20
lqy.java.my.name=王王aa
lqy.java.my.map.a=哈哈a
lqy.java.my.map.b=哈哈b
 
 

2、配置类

必须设置编码:encoding = "UTF-8"

 
import java.util.Map;
 
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
 
@Configuration
@ConfigurationProperties(prefix = "lqy.java.my", ignoreUnknownFields = true)
@PropertySource(encoding = "UTF-8", value = "classpath:custom.properties", ignoreResourceNotFound = true)
public class Custom {
 
    private Integer id;
    private String name;
    private Map<String, String> map;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    @Override
    public String toString() {
        return "Custom [id=" + id + ", name=" + name + ", map=" + map + "]";
    }
    
    
    
    
}

输出没乱码:

custom = Custom [id=20, name=王王aa, map={b=哈哈b, a=哈哈a}]

(时间宝贵,分享不易,捐赠回馈,^_^)

================================

©Copyright 蕃薯耀 2021-12-22

https://www.cnblogs.com/fanshuyao/

今天越懒,明天要做的事越多。
原文地址:https://www.cnblogs.com/fanshuyao/p/15718594.html