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
重新运行项目后,中文乱码问题应该得到解决。
热门推荐
CBD、CCD、CLD、CID都是啥意思?一文看懂常见的地产专业名词
酒精能杀死幽门螺杆菌吗
不锈钢储罐和塑料储罐哪种更适合您的需求
番薯叶的功效与作用、禁忌和食用方法
自考档案管理全攻略:内容、方法与问题解决
新加坡:全球最佳教育体系的领跑者
如何利用移动平均线进行股票分析?这些分析方法对投资策略有何帮助?
红眼病的治疗与预防:保持清洁与良好生活习惯的重要性
研究探讨鱼油对老年人大脑的影响
买了一座“高纯”石英矿,结果却是这个样
英红九号红茶:探秘其特性、保质期及市场地位
黑椒鸡柳烹饪技巧与营养分析
手机导航使用攻略:四种实用技巧让你家门口环境一目了然
如何创建高效的工程进度计划表?
如何使用公式在 Excel 中设置小数位(5 种方法)
如何轻松找到与他人交流的话题?
lol战斗先机有什么用
城镇居民自建房房产证办理流程及城镇开发边界内搬迁政策详解
西夏那点事:李德明的远见与银川的崛起
芭蕾舞和古典舞哪个好学?
塑造理想城市的N种模样
汽车的发展历程与未来趋势
同样是榴莲,为何价格参差不齐?一文读懂榴莲价格波动原因
所罗门·阿施:探索从众心理的先驱
世界十大顶尖特种部队,揭秘铁血精英的神秘面纱
怎样申请摩托车驾驶证?申请过程中有哪些注意事项?
科普|拔牙时也需要心电监护?哪些人需要这么做?
科普|拔牙时也需要心电监护?哪些人需要这么做?
2025年中国律所:出海还是留守?
十大富含维生素E的食物排行榜