包含spring.profiles.include的配置文件似乎覆盖而不是包含

时间:2014-09-23 02:01:45

标签: spring spring-boot

我正在尝试为几个Spring Boot应用程序分配配置属性。我正在使用Spring Boot 1.1.6,我们的配置属性以通常的application.yml样式在YAML中表示。我已经为常见的基本参数,常见的数据库参数等创建了各种配置文件。我试图使用Spring Boot参考文档中提到的include功能,但它似乎可以作为覆盖而不是包含。即与我想要的完全相反。鉴于application.yml中的以下内容,当 bar 配置文件处于活动状态时,我希望属性 name 具有值 bar ,但是相反,它被设置为 foo (来自包含的配置文件)。我认为包含的概念意味着它首先被加载,并且在新配置文件中设置的任何具有相同名称的属性将覆盖包含的配置文件中的属性。有点像子类正在从超类中遮蔽一个字段,子类的任何实例都会反映阴影值。这是文件:

spring:
  profiles: foo
name: foo

--- # New YAML doc starts here

spring:
  profiles: 
    include: foo
  profiles: bar
name: bar

如果我在测试用例中明确激活了“bar”配置文件,那么 name 属性仍然是foo:

SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise

但是,如果我注释掉包含:

spring: 
profiles: bar
#  profiles: 
#    include: foo

并在我的代码中明确激活两个配置文件:

builder.profiles("foo", "bar");

然后它按预期工作,名称属性设置为 bar 。我宁愿在YAML文件中处理包含的主要原因是它对我的实际代码的影响较小,我可以在一个地方管理所有配置文件。使用另一种方法,如果我要重命名配置文件,我必须在整个项目中搜索配置文件字符串和可能的@Profile注释。这肯定更容易出错。我认为更灵活的解决方案是明确能够表达所包含的配置文件是否覆盖子配置文件值。也许是这样的:

spring:
  profiles: bar
  profiles:
    include: foo
      override: false

也许我在这里错过了一些东西。有没有更好的方法呢?谢谢。

1 个答案:

答案 0 :(得分:4)

尝试以下 foo 包含但覆盖 bar ,似乎适用于我的解决方案

spring:
    profiles:
        include: bar
        active: foo,bar

编辑:请注意,这是一个“黑客”,没有得到官方支持,而且是2016版本