如何从application.yaml中正确获取日文配置值?
看起来你遇到了Spring Boot读取YAML文件中日文乱码的棘手问题,我来帮你一步步排查和解决:
1. 先确认YAML文件的实际编码格式
这是最容易被忽略的核心点!很多时候我们默认文件是UTF-8,但实际编辑器保存时用了其他编码(比如Windows下的GBK、Shift-JIS)。
- 如果你用IDEA/STS这类IDE,看编辑器右下角的编码标识,确保显示的是
UTF-8;如果不是,点击编码选择「Convert to UTF-8」后重新保存文件。 - 用记事本打开文件,选择「另存为」,查看底部的编码选项,确认是
UTF-8(注意不要选带BOM的UTF-8,部分解析器对BOM格式不友好)。
2. 移除无效的@PropertySource注解(关键修复!)
你尝试添加的@PropertySource(value = "classpath:application.yaml", encoding = "UTF-8")其实完全不生效——因为@PropertySource默认只支持.properties格式的配置文件,无法解析YAML。这个注解不仅帮不上忙,还可能干扰Spring Boot的自动配置逻辑,建议直接删除它。
Spring Boot会自动加载classpath下的application.yaml,只要你的@ConfigurationProperties配置正确,就能正常绑定配置项,不需要手动指定加载源。
3. 确保JVM启动参数确实生效
你添加的-Dfile.encoding=UTF-8需要确认是否真的被JVM加载。可以在代码里加一行调试代码验证:
System.out.println("当前JVM编码:" + System.getProperty("file.encoding"));
如果输出不是UTF-8,说明启动参数没生效:
- 在IDEA中,要把参数加到「Run/Debug Configuration」的「VM options」里,而不是「Program arguments」。
- 如果是Jar包运行,确保命令是
java -Dfile.encoding=UTF-8 -jar your-app.jar。
4. 针对Spring Boot旧版本的SnakeYAML配置
Spring Boot底层用SnakeYAML解析YAML文件,在2.2.0版本之前,SnakeYAML默认会使用JVM的系统编码,而不是强制UTF-8。如果你的Spring Boot版本低于2.2.0,可以通过自定义YamlPropertiesFactoryBean来指定编码:
@Configuration public class YamlEncodingConfig { @Bean public YamlPropertiesFactoryBean yamlPropertiesFactoryBean() { YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean(); factoryBean.setResources(new ClassPathResource("application.yaml")); factoryBean.setEncoding("UTF-8"); return factoryBean; } }
如果是2.2.0及以上版本,这个配置Spring Boot已经默认处理好了,不需要额外操作。
5. 临时备选方案:Unicode转义写法
如果上面的方法都没解决,可以临时用Unicode转义代替直接写日文,比如:
customer: vote: people: vote-order: 1: id: 3 name: "\u793E\u9577\u69D8" # 对应“社長様” 2: id: 4 name: "\u4F1A\u9577\u69D8" # 对应“会長様”
不过这只是临时 workaround,还是建议优先解决编码的根源问题。
最后验证
修改完成后重启应用,在代码里输出peoples.get(2).getName(),或者用调试模式查看变量值,确认日文是否正常显示。如果还是有问题,可以检查:
- 项目编译编码:IDEA中「Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler」确保编码为UTF-8。
- 控制台编码:IDEA中「Settings -> Editor -> File Encodings」把「Console Encoding」设为UTF-8。
内容来源于stack exchange

