我正在开发一个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'
并选择性地覆盖系统属性。
有谁知道怎么做?
答案 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不能自然合作超出我的范围。