Spring Boot yaml属性解析错误:Ubuntu环境下敏感字段加载为加密值
问题原因及解决方案
核心原因
该问题的本质是Spring Boot配置源优先级导致的yaml配置被覆盖,和系统环境、运行配置相关,Mac环境无对应覆盖项所以运行正常,常见触发场景如下:
- Ubuntu系统或IDEA运行配置中存在
DB_URL、DB_USERNAME、DB_PASSWORD环境变量:Spring Boot默认支持将大写+下划线分隔的环境变量自动映射为小驼峰/短横线分隔的配置项,优先级高于本地yaml文件,若这几个环境变量存储的是加密值就会直接覆盖你yaml里的明文配置 - 多环境配置激活规则不一致:Ubuntu环境激活的配置文件(比如application-prod.yaml)里对应字段是加密值,和Mac激活的dev环境配置不同
- 项目引入jasypt等配置加密组件时,两个环境的加密密钥配置不一致,且开启了解密失败不报错的配置,导致未正确解密拿到原始加密串
解决方案
按优先级排查即可:
- 先排查环境变量:
- 在Ubuntu终端执行命令
echo $DB_URL $DB_USERNAME $DB_PASSWORD,确认是否输出了你拿到的加密串,如果是删除对应系统环境变量即可 - 打开IDEA的「Run/Debug Configurations」,找到你当前的Spring Boot启动项,查看「Environment variables」栏是否配置了上述三个变量,删除后重启项目
- 在Ubuntu终端执行命令
- 检查多环境激活配置:
查看spring.profiles.active配置值,确认Ubuntu和Mac环境激活的配置文件是否一致,确保加载的是同一份yaml配置 - 排查加密组件配置:
如果项目引入了jasypt-spring-boot-starter等加密依赖,确认Ubuntu环境的jasypt.encryptor.password密钥配置和Mac一致,同时关闭jasypt.encryptor.fail-on-error=false配置,解密失败时直接抛出异常便于定位问题 - 定位配置源:
若上述步骤都未解决,可以在代码中注入org.springframework.core.env.Environment对象,遍历所有配置源定位db.url的取值来源:@Autowired private Environment env; // 项目启动后执行以下代码 System.out.println(env.getProperty("db.url")); if (env instanceof StandardEnvironment standardEnv) { for (PropertySource<?> ps : standardEnv.getPropertySources()) { if (ps.containsProperty("db.url")) { System.out.println("配置来源:" + ps.getName()); } } }
内容的提问来源于stack exchange,提问作者Akhil Sharma
相关产品推荐
相关产品推荐

