使用@Value()读取application.yml环境变量默认值失败怎么解决?
问题原因
你把环境变量的默认值配置在了app.security.testUser这个配置项里,但读取的时候直接用@Value("${TEST_USER}")去读环境变量TEST_USER——这个环境变量本身没设置,也没给它加默认值,自然会报错。yml里的配置逻辑是给app.security.testUser这个配置项赋值:优先取环境变量TEST_USER,没有就用spring,但这和顶层的环境变量TEST_USER本身没关系。
解决方案
有两种可行的解决方式,选一种即可:
方式一:直接在@Value里加默认值(最简洁)
不用在yml里额外配置,直接在读取时给环境变量设置默认值:
@Value("${TEST_USER:spring}") private String testUser; @Value("${TEST_PASSWORD:secret}") private String testPassword;
这样不管系统有没有设置TEST_USER、TEST_PASSWORD环境变量,都能正常取值——有环境变量就用环境变量的值,没有就用默认的spring和secret。
方式二:读取yml里配置的完整路径
如果要保留yml里的配置规则,读取时要对应yml里的配置项路径,而非直接读环境变量名:
首先保持yml配置不变:
app: security: testUser: ${TEST_USER:spring} testPassword: ${TEST_PASSWORD:secret}
然后修改读取代码,对应配置项的完整路径:
@Value("${app.security.testUser}") private String testUser; @Value("${app.security.testPassword}") private String testPassword;
这样读取的是yml里的app.security.testUser配置项,它会自动按你设置的规则:优先取环境变量TEST_USER,没有就用默认值。
另外你之前试的${TEST_USER:#{spring}}是SpEL写法,但核心问题还是读取路径不对,所以不管怎么改默认值的写法,只要读的是TEST_USER就会报错。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

