【问题标题】:Optional environment variables in Spring appSpring 应用程序中的可选环境变量
【发布时间】:2025-12-26 08:40:16
【问题描述】:

在我的 Spring Boot 应用程序的 application.properties 中,我有这个定义:

someProp=${SOME_ENV_VARIABLE}

但这是一个可选值,只在某些环境下设置,我是这样使用的

@Value("${someProp:#{null}}")
private String someProp;

令人惊讶的是,当 env. var 不存在
Could not resolve placeholder 'SOME_ENV_VARIABLE' in string value "${SOME_ENV_VARIABLE}"
如果在任何PropertySource 中找不到,我希望 Spring 设置一个空白值。

如何让它成为可选的?

【问题讨论】:

  • 试试这个:@Value("${SOME_ENV_VARIABLE:#{null}}")
  • @MouadELFakir 感谢您的建议,但我需要一种方法在属性文件中执行此操作

标签: spring spring-boot environment-variables


【解决方案1】:

application.properties中提供一个默认值

someProp=${SOME_ENV_VARIABLE:#{null}}

当像@Value("${someProp}) 一样使用时,这将正确评估为null。首先,如果在处理application.properties 时未找到SOME_ENV_VARIABLE,则其值变为字符串文字“#{null}”。然后,@ValuesomeProp 评估为 SpEL 表达式,结果为 null。实际值可以通过查看Environment bean 中的属性来验证。

此解决方案使用PlaceholderConfigurerSupport 类指定的默认值语法

可以为每个配置器全局定义默认属性值 通过 properties 属性或逐个属性的实例 使用默认值分隔符的基础,默认情况下是“:”和 可通过 setValueSeparator(String) 自定义。

Spring SpEL expression templating

来自 externalized configuration 上的 Spring Boot 文档

最后,虽然您可以在@Value 中编写 SpEL 表达式,例如 表达式不会从应用程序属性文件中处理。

【讨论】:

  • 谢谢,它有效。它是否在 Spring 文档中的任何地方指定?
  • 编辑了答案以包括一些文档和解释为什么这样做。
  • 使用字符串默认值,这在 application.properties someProp=${SOME_ENV_VARIABLE:#{"default_value"}} 中对我有用
  • @MauricioID:这对我不起作用,我必须使用 someProp=${SOME_ENV_VARIABLE:default_value} 来表示字符串值。
  • 空字符串可以这样声明:someProp=${SOME_ENV_VARIABLE:}
【解决方案2】:

因为这对其他来这里的人来说可能很有趣,所以您可以隐式地覆盖任何带有 env 变量的属性文件。假设你有财产。

someapp.foo

然后你可以定义一个环境变量SOMEAPP_FOO(大写字母和 . -> _ ),spring 会从环境中隐式设置属性。变量。

这里有描述

https://www.tutorialworks.com/spring-boot-kubernetes-override-properties/

【讨论】:

    【解决方案3】:

    这对我有用:

    spring.datasource.url=jdbc:mysql://${DB_IP:localhost}:3306/app
    spring.datasource.username=${SPRING_DATASOURCE_USERNAME:mylocaluser}
    spring.datasource.password=${SPRING_DATASOURCE_PASSWORD:localpass}
    

    【讨论】: