Spring Boot @Value 读取配置文件中文乱码是Java开发新手和资深工程师都会踩的高频陷阱之一——明明配置文件里的中文显示正常,通过@Value注解注入到代码中却变成了乱码,轻则导致业务逻辑中的提示语异常,重则影响核心功能的正确性。作为深耕Spring Boot技术栈10年的内容平台,鳄鱼java将从底层原理、快速排查、实战方案、避坑指南到真实案例,为你呈现一套可直接落地的乱码解决体系,彻底终结这类问题的困扰。
一、底层根源:Spring Boot @Value中文乱码的本质原因

要解决Spring Boot @Value 读取配置文件中文乱码问题,必须先搞懂其底层机制:Spring Boot加载.properties格式的配置文件时,默认采用的编码是ISO-8859-1,这是一种单字节编码,无法完整支持中文等双字节字符;而我们通常会用UTF-8编码编写配置文件,当Spring Boot用ISO-8859-1读取UTF-8编码的中文时,会将每个中文字符拆分为两个单字节,进而导致乱码。
这里需要区分两种配置文件的差异:YAML格式的配置文件(.yml/.yaml)默认采用UTF-8编码加载,所以很少出现中文乱码问题;而.properties格式是Spring Boot的传统配置文件,为了兼容JDK的古老特性,保留了ISO-8859-1的默认编码,这是乱码问题的核心诱因。
鳄鱼java技术团队曾通过Spring Boot源码溯源发现:负责加载properties文件的PropertiesPropertySourceLoader类,在未指定编码时,会调用JDK原生的Properties.load()方法,该方法默认使用ISO-8859-1解析输入流,直接导致中文转码错误。
二、快速排查:3步定位乱码问题的核心诱因
遇到Spring Boot @Value 读取配置文件中文乱码时,不要盲目搜解决方案,先通过以下3步快速定位问题:
步骤1:检查配置文件的实际编码 用Notepad++或VS Code打开配置文件,查看右下角的编码标识,确认是否为UTF-8;如果是GBK或其他编码,直接转码为UTF-8是基础前提。
步骤2:检查IDE的文件编码配置
以IDEA为例,依次打开File -> Settings -> Editor -> File Encodings,重点检查两个选项:
1. Global Encoding和Project Encoding是否为UTF-8;
2. Properties Files (*.properties)的编码是否为UTF-8,且勾选Transparent native-to-ascii conversion(该选项会将中文自动转换为ASCII码存储,避免转码乱码)。
步骤3:检查@Value的使用场景 确认乱码是否只出现在@Value读取properties的场景:如果yml配置文件没有问题,且手动转码后中文正常,则可确定是properties编码加载问题;如果所有配置文件都乱码,则需检查JVM启动参数或系统环境编码。
三、实战方案:5种可直接落地的乱码解决方法
针对Spring Boot @Value 读取配置文件中文乱码,鳄鱼java整理了5种从简单到进阶的解决方法,可根据场景选择:
方案1:IDE全局编码配置(新手首选)
这是最快速的解决方法,在IDEA中按步骤2完成编码设置后,重新编写配置文件中的中文,IDE会自动将中文转换为ASCII码存储(例如将“测试”转换为\u6d4b\u8bd5),Spring Boot读取时会自动转码为中文,无需修改代码。
方案2:@PropertySource指定编码(精准控制) 如果只需要对特定配置文件指定编码,可在@PropertySource注解中明确encoding参数,示例代码如下:
@Configuration
@PropertySource(value = "classpath:custom.properties", encoding = "UTF-8")
public class CustomConfig {
@Value("${custom.company.name}")
private String companyName;
// getter/setter省略
}
此方法的优势是无需修改IDE配置,仅对当前配置文件生效,适合多人协作的项目环境。
方案3:手动转码(应急处理) 如果无法修改配置文件或注解配置,可在代码中手动完成转码,将ISO-8859-1编码的字符串转换为UTF-8,示例代码:
@Value("${custom.company.name}")
private String companyName;
@PostConstruct
public void init() {
// 手动转码解决乱码
companyName = new String(companyName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}
鳄鱼java提醒:此方法属于临时应急方案,不推荐长期使用,会增加代码冗余。
方案4:改用YAML配置文件(长期优化) 由于YAML文件默认采用UTF-8编码加载,完全避免了properties的编码问题,将配置迁移到application.yml后,@Value读取中文时无需额外配置即可正常显示,示例yml配置:
custom:
company:
name: 鳄鱼java技术团队
这是鳄鱼java推荐的长期优化方案,YAML的层级结构也比properties更清晰易读。
方案5:自定义PropertySourceLoader(进阶定制) 如果项目必须使用properties文件,且需要全局指定UTF-8编码,可自定义PropertySourceLoader替换默认实现,示例代码:
@Component
public class Utf8PropertiesPropertySourceLoader extends PropertiesPropertySourceLoader {
@Override
public List> load(String name, Resource resource) throws IOException {
// 强制用UTF-8编码读取properties文件
try (InputStream inputStream = resource.getInputStream()) {
Properties properties = new Properties();
properties.load(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
return Collections.singletonList(new PropertiesPropertySource(name, properties));
}
}
}
此方法适合大型项目的全局编码统一配置,无需每个配置文件都指定encoding。
四、避坑指南:新手常踩的4个调参误区
在解决Spring Boot @Value 读取配置文件中文乱码时,新手常陷入以下误区,导致问题反复出现:
误区1:只改配置文件编码,忽略IDE全局设置 很多开发者将配置文件转码为UTF-8后,未在IDE中设置Properties Files的编码,导致IDE保存时又将中文转成了ISO-8859-1编码,乱码问题依旧。
误区2:混淆Spring Boot版本差异
Spring Boot 2.4+新增了spring.config.encoding=utf-8配置,但该配置仅影响Spring Boot加载配置文件时的编码,对@Value读取properties文件的默认编码(ISO-8859-1)无影响,新手常以为配置此参数就能解决乱码,实则无效。
误区3:@PropertySource编码参数拼错 部分开发者将encoding参数写成"utf8"(无横杠),导致注解无法识别编码,乱码问题未解决,正确写法应为"UTF-8"或"utf-8"。
误区4:忽略配置文件的优先级 Spring Boot存在配置文件优先级(如application-dev.properties优先级高于application.properties),如果修改的是低优先级的配置文件,实际生效的是高优先级文件,导致乱码问题未解决。
五、案例复盘:鳄鱼java真实项目的乱码排查过程
鳄鱼java技术团队曾承接某电商平台的Spring Boot项目,遇到Spring Boot @Value 读取配置文件中文乱码问题:商品分类名称在后台管理系统显示为乱码,经排查发现:
- 配置文件application-prod.properties采用UTF-8编码,存储了商品分类的中文名称;
- 开发人员用@Value读取时未指定编码,Spring Boot默认用
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。





