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
重新运行项目后,中文乱码问题应该得到解决。
热门推荐
诺基亚经典机对比评测:5230 vs 5233
深度解析韩国电影《非常宣言》:灾难中的人性考验
《头脑特工队2》拿北美票房冠军,“让成年观众深度共情”
这部正在上映的美国片,可谓最近最强动作片
高速免费政策:经济发展的新引擎还是拥堵之源?
春节高速免费期间,如何避免扣分?
《唐探1900》票房破14亿!陈思诚的“唐探”宇宙如何持续闪耀?
《唐探1900》新春发布会:十年情怀大揭秘!
熊胆胶囊的正确用法大揭秘!
万秘堂琥珀金胆熊胆粉:权威推荐的安全选购指南
秋冬咽喉肿痛?熊胆粉帮你缓解!
长女抚养权争议,法院如何守护孩子权益?
胃溃疡患者的温和饮食:鸡肉还是鱼肉?
徽派建筑设计的五大特征、成因和价值分析
泰森和刘易斯最艰难对手揭秘:伟大霍利菲尔德!
拳坛ABC法则之张志磊、乔伊斯、帕克——解读三人互相克制的原因
37连胜!历史上最著名的拳击手!泰森其实被高估?
在浙江边玩边学!带孩子打卡这些工业旅游景点
如何通过饮食和运动预防腹股沟疝?
腹腔镜微创手术:腹股沟疝治疗的新选择
《小舍得》背后:家长体罚孩子的法律风险与危害
科学育儿:告别体罚,拥抱正向教养
“棍棒底下出孝子”?别再这样教孩子了!
和平精英职业选手教你调节灵敏度:从入门到精通
和平精英职业选手教你调节灵敏度:从入门到精通
从《一路繁花》看倪萍王文澜:一段婚姻的真相与启示
倪萍王文澜离婚后:一个重返舞台,一个专注摄影,事业发展大不同
倪萍王文澜离婚背后:一段被误解的婚姻
昆明滇池边民宿:推窗见湖的诗意生活
带宠物出行,这些“行头”要先准备好!