我已经建立了一个春季启动项目。
在其中,我有一个如下所示的属性类:
@Configuration
@PropertySource(value = "classpath:abc.properties")
@ConfigurationProperties
public class ABCProperties {
private Map<String, String> someUrls;
@Bean
public Map<String, String> someUrls() {
return someUrls;
}
public Map<String, String> getSomeUrls() {
return someUrls;
}
public void setSomeUrls(Map<String, String> someUrls) {
this.someUrls = someUrls;
}
}
abc.properties文件的内容如下所示:
someUrls.urlA=someURL
someUrls.urlB=someOtherURL
在项目中,在resources文件夹(和test resources文件夹)中,我提供了一个abc.properties文件。一旦构建并运行,程序就可以按预期访问abc.properties文件中的属性(也可以在测试中正确访问) - 它们很好地映射到我的url映射。
到目前为止一切顺利。
但是,我在属性类中引用的URL并不总是相同的。在某些部署中,我想覆盖它们。使用我的application.properties文件中指定的属性,这很容易;只需在我运行应用程序的同一个(根)文件夹中有另一个外部application.properties文件,它将覆盖我自动放入的任何属性。
我想要做的有时也是在应用程序的根文件夹中放置一个外部abc.properties文件,并以相同的方式覆盖abc.properties属性。当然我试过这个,但是abc.properties文件中内置到jar 中的属性被保留而不会被覆盖。实际上,我不确定spring boot程序是否识别出根文件夹中存在另一个外部abc.properties文件。
我似乎无休止地阅读了如何在没有成功的情况下实现这一目标。我也尝试在我的application.properties中指定以下内容但它没有任何区别(即使它确实有效也不理想,因为我不想在所有情况下都指定直接路径)。
spring.config.location=/path/to/application/root/
spring.config.name=abc.properties
如果我不得不猜测,问题是在属性类中我指向'classpath:..'并且外部文件实际上不在类路径上,因为它是......外部的。
但是 spring boot知道如何在其根应用程序文件夹中查找覆盖application.properties所以我希望它还能够查找其他属性文件来覆盖?我无法理解如何实现这一点。
是的,我特别希望我的属性在这个abc.properties文件而不是应用程序属性中。
非常感谢您的任何帮助!
答案 0 :(得分:6)
你有没有看过PropertySources?
@PropertySources({
@PropertySource("classpath:abc.properties"),
@PropertySource(value="file:abc.properties", ignoreResourceNotFound=true)
})
来自他们的文件:
如果给定的属性键存在于多个.properties文件中,则处理的最后一个@PropertySource批注将“赢”并覆盖。
基本上你在这里说的是:从classpath加载abc.properties,但也从这个外部位置加载abc.properties,如果找不到则忽略后者。它应该覆盖您在外部文件中声明的属性。
没有对此进行测试,所以希望它可以解决。