我正在使用@PropertySource和@ConfigurationProperties的组合,但我想用外部属性文件

时间:2017-10-31 18:26:08

标签: java spring-boot properties configuration properties-file

我已经建立了一个春季启动项目。

在其中,我有一个如下所示的属性类:

@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文件而不是应用程序属性中。

非常感谢您的任何帮助!

1 个答案:

答案 0 :(得分:6)

你有没有看过PropertySources

@PropertySources({
    @PropertySource("classpath:abc.properties"),
    @PropertySource(value="file:abc.properties", ignoreResourceNotFound=true)
})

来自他们的文件:

  

如果给定的属性键存在于多个.properties文件中,则处理的最后一个@PropertySource批注将“赢”并覆盖。

基本上你在这里说的是:从classpath加载abc.properties,但也从这个外部位置加载abc.properties,如果找不到则忽略后者。它应该覆盖您在外部文件中声明的属性。

没有对此进行测试,所以希望它可以解决。