【问题标题】:Spring weird behavior for overriding variables in application.properties with environment variables使用环境变量覆盖 application.properties 中的变量的 Spring 奇怪行为
【发布时间】:2018-10-01 21:13:05
【问题描述】:

我正在使用 Spring Boot 2,通过阅读有关外部化属性 here 的文档,我希望我可以通过声明同名的 os 环境变量来覆盖 application.properties 中变量的值。

所以我尝试如下。

首先,在src/main/resources/application.properties中声明以下2个变量

my.prop = hello   
myProp = hello    

接下来,使用以下内容创建src/main/java/me/Main.java

@SpringBootApplication
public class Main {

    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    @Value("${my.prop}")
    String myDotProp;

    @Value("${myProp}")
    String myProp;

    @Value("${my.env.prop}")
    String envDotProp;

    @PostConstruct
    public void test() {
        logger.debug("my.prop : " + myDotProp);
        logger.debug("myProp : " + myProp);
        logger.debug("my.env.prop : " + envDotProp);
    }

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

现在,使用 Windows 环境变量面板来声明 3 个变量,如下图所示。

最后,运行mvn spring-boot:run,结果是这样的

2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.prop : hello
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : myProp : world
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.env.prop : world

请注意

  1. 无论变量名中是否有点(.),Spring都能看到环境变量,如myPropmy.env.prop所示

  2. Spring 可以使用同名的 os 环境变量的值覆盖application.properties 中变量的值仅当名称不包含点 (.) 时,如图所示在myPropmy.prop 中:myProp 的值已成功覆盖为world,但my.prop 的值保持hello 即使我声明了操作系统环境变量my.prop

这种行为是否有原因?有没有办法配置 Spring,以便我可以在我的属性变量中使用 dot 以及使用 os env 变量覆盖它们?

【问题讨论】:

  • 在使用系统环境变量时,建议使用大写符号,所以要设置MY_ENV_PROPMY_PROPMYPROP

标签: java spring spring-boot environment-variables


【解决方案1】:

将环境变量中的. 替换为_
例如,如果在 Spring Boot 中将该属性命名为 my.env.prop,以便使用名为 my_env_prop 的环境变量覆盖它,Spring 会自动进行转换。

. 出现问题的原因是某些操作系统不支持环境变量名称中的.

此处讨论的类似问题:How to set a Spring Boot property with an underscore in its name via Environment Variables?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2021-11-08
    • 2020-03-15
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多