SpringBoot读取properties中文乱码解决方案
创作时间:
作者:
@小白创作中心
SpringBoot读取properties中文乱码解决方案
引用
CSDN
1.
https://blog.csdn.net/m0_74824845/article/details/146431756
一、问题描述
在使用SpringBoot开发过程中,如果需要在application.properties中配置带有中文字符串的参数,并将其注入到业务类中,可能会遇到中文乱码的问题。例如:
package com.cnstar.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest(classes = TestApplication.class)
@RunWith(SpringRunner.class)
public class CnstarTest {
@Value("${name}")
private String name;
@Test
public void test1() {
System.out.println("中文内容:" + name);
}
}
打印输出结果可能显示为乱码。
二、解决方案
2.1、网络上的解决办法
遇到问题首先想到网络上找解决方案,网络上的解决办法基本一致,概括为以下三种。
2.1.1、修改IDEA编码
在IDEA中将所有的编码设置为UTF-8,同时勾上Transparent native-to-ascii conversion的选项,然后重新创建application.properties的文件。
但是这个配置文件用记事本打开编辑时,发现内容被修改成了unicode编码,在线上修改时变得很困难,所以此方式不推荐。
2.1.2、改为yml配置
将application.properties的文件修改为application.yml的结构,重启项目。
证明是可行的。这种方式可以根据自己需求选择,但是当配置文件的内容层级较深时也不推荐,容易看错行配置。
2.1.3、读取时设置编码
package com.cnstar.test.property;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.annotation.PostConstruct;
@Configuration
@PropertySource(value = "classpath:application.properties", encoding = "utf-8")
public class CnstarProperty {
@Value("${name}")
private String name;
@PostConstruct
public void init() {
System.out.println("name is :" + name);
}
}
亲测发现这种方式针对application.properties是不行的。但是针对其他名称的properties文件是可以的
package com.cnstar.test.property;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import javax.annotation.PostConstruct;
@Configuration
@PropertySource(value = "classpath:test.properties", encoding = "utf-8")
public class CnstarProperty {
@Value("${name2}")
private String name;
@PostConstruct
public void init() {
System.out.println("name is :" + name);
}
}
2.2、重写资源加载类(推荐)
1、创建一个类继承PropertiesPropertySourceLoader,因SpringBoot版本不同PropertiesPropertySourceLoader类会有差别,本文采用的SpringBoot版本是2.3.12.RELEASE。
package com.cnstar.utils;
import org.springframework.core.io.*;
import org.springframework.core.env.*;
import org.springframework.boot.env.*;
import java.util.*;
import java.io.*;
public class SelfPropertySourceLoader extends PropertiesPropertySourceLoader {
@Override
public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
Map<String, ?> properties = this.loadUseUtf8(resource);
if (properties.isEmpty()) {
return Collections.emptyList();
}
return Collections.singletonList(new OriginTrackedMapPropertySource(name, Collections.unmodifiableMap((Map<?, ?>)properties), true));
}
private Map<String, ?> loadUseUtf8(Resource resource) throws IOException {
Properties props = new Properties();
InputStream is = resource.getInputStream();
try {
String filename = resource.getFilename();
if (filename != null && filename.endsWith(".xml")) {
props.loadFromXML(is);
}
else {
props.load(new InputStreamReader(is, "utf-8"));
}
} finally {
is.close();
}
return (Map)props;
}
}
2.在resource目录下创建目录META-INF,在META-INF目录下创建文件spring.factories
内容如下:
org.springframework.boot.env.PropertySourceLoader=com.cnstar.utils.SelfPropertySourceLoader
重新运行项目后,中文乱码问题应该得到解决。
热门推荐
这一生,何以安身立命?
报双非院校好就业吗女生
20位“不大出名”的诗人,一人一首千古佳作,一首诗成就一位诗人
SQL知识:图解SQL中的where和on的区别
23种设计模式-模板方法(Template Method)设计模式
探讨磁环在电磁兼容性(EMC)中的重要性以及其应用建议
俞敏洪的励志故事:激励着无数人追求梦想,不屈不挠、努力奋斗
国泰 vs 新航:飞机上该不该禁充电宝?
3年布局26个省实验室 河南加速向“新”而行
新大学日语标准教程基础篇1
中国手机为什么没能征服日本这座“孤岛”?
柳宗元散文的艺术成就
小脚裤配什么鞋(小脚裤搭配指南:如何选择鞋子)
机器人基础知识:六轴机器人详解
民航支线航线发展得怎样了?
一张图看懂汽车制造全过程,简洁明了
上汤菠菜,风味浓郁且超级下饭的鲜汤!
北大“数学奇才”毕业执意出家,父母哭求拦不住,9年后说出真相
贴墙纸的正确方法步骤以及铺贴的注意事项
再生料PP:应用、发展和挑战
外企如何提升英语能力
什么是高性能排气系统?从原理到应用的全面解析
瑞金团队胰腺癌mRNA疫苗实现突破:如何解决“癌王”两大关键问题?
混凝土浇筑需要多少天?详细解析施工周期与养护时间
这4个部位“青筋”暴起,可能是身体的求救信号
“开盒”这扇网暴之门,必须关上!
掌握选择指南,找到最适合自己的笔记本电脑秘诀
如何选择24寸显示器的最佳分辨率(影响显示效果的关键因素及优化方法)
SQLite数据库的存储机制及其优势
财务人员如何提升Excel技能,高效处理财务数据?