覆盖@ConfigurationProperties

时间:2016-05-13 19:54:32

标签: java spring spring-boot spring-integration

我正在开发一个Spring Integration / Boot应用程序。我正在使用多文档application.yml(src / main / resources / application.yml)来设置几个配置类的默认值(使用@ConfigurationProperties注释)。 Applicaiton.yml附带默认值,其中一些需要被覆盖,具体取决于环境。

我愿意使用Java系统属性(-D ... = ...),Spring“属性”(--... = ...),或者最好是位于Jar外部的yaml文件,在目录中。

Application.yml有4个文档,每个文档对应一个不同的配置类。我们只关注ServerConfig:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(locations = "classpath:application.yml", prefix = "server")
public class ServerConfig {
    private Integer port;
    private String address;

    public Integer getPort() {
        return port;
    }

    public void setPort(Integer port) {
        this.port = port;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

Application.yml:

server:
  address: ::1
  port: 8080

---

注意我在注释中指定locations的方式。这会加载application.yml并成功使用这些值,但我无法弄清楚如何覆盖它们(例如-Dserver.port = 7777或--server.port = 7777)。如果我删除locations = ...,那么我可以使用`-Dserver.port = 7777,但是application.yml中的默认值永远不会被加载,因此我必须将每个值指定为命令行参数。

我已多次阅读https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html,我无法理解为什么我不能在配置注释中留下locations = 'application.yml'并选择性地覆盖系统属性。

有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

。这是应用程序启动的一个问题 - 由于我在Spring Integration和Spring Boot之间的混淆造成的。

我的主要方法曾经是:

 @SpringBootApplication
 public class Main {
     public static void main(String... args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("org.fandingo.blah.blah");
        ctx.registerShutdownHook();
 }

我的理解是,你是如何启动仅仅是Spring Integration的应用程序(当然假设是JavaConfig)。问题是YAML属性加载是Spring Boot功能。切换出使用Spring Boot方法的main方法修复了这个问题:

 @SpringBootApplication
public class Main {
    public static void main(String... args) {
        SpringApplication app = new SpringApplication(Main.class);
        app.setRegisterShutdownHook(true);
        app.run(args);
    }
}
春天太复杂而神秘了。为什么Spring Integration和Boot不能自然合作超出我的范围。