java—我正在使用@propertysource和@configurationproperties的组合,但我想用外部属性文件覆盖它们

bwntbbo3  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(382)

我已经建立了一个 Spring 启动项目。
其中有一个properties类,如下所示:

@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;
    }
}

.properties文件的内容如下所示:

someUrls.urlA=someURL
someUrls.urlB=someOtherURL

在项目中的resources文件夹(和testresources文件夹)中,我提供了一个.properties文件。一旦构建并运行,程序可以按预期访问.properties文件中的属性(也可以在测试中正确访问)-它们很好地Map到我的urlMap。
到现在为止,一直都还不错。
然而,我在properties类中引用的url并不总是相同的。在某些部署中,我想覆盖它们。对于在my application.properties文件中指定的属性,这很简单;只要在运行应用程序的同一(根)文件夹中有另一个external application.properties文件,就会自动覆盖我放入其中的任何属性。
我想做的是有时也把一个外部.properties文件放在应用程序的根文件夹中,让它以同样的方式覆盖.properties属性。当然我试过了,但是jar中内置的.properties文件中的属性是保留的,不会被覆盖。事实上,我不确定spring引导程序是否识别出根文件夹中有另一个外部.properties文件。
我似乎没完没了地读过关于如何在没有成功的情况下实现这一目标的书。我也尝试过在application.properties中指定以下内容,但没有什么不同(即使它确实有效,也不是很理想,因为我不希望在所有情况下都指定直接路径)。

spring.config.location=/path/to/application/root/
spring.config.name=abc.properties

如果非要我猜的话,问题是在properties类中我指的是'classpath:..'外部文件实际上不在类路径上,因为它是。。。。好的,外部的。
但是SpringBoot知道如何在根应用程序文件夹中查找覆盖的application.properties,所以我希望它也能够查找其他要覆盖的属性文件?我只是不知道如何做到这一点。
是的,我特别希望我的属性在.properties文件中,而不是在应用程序属性中。

zdwk9cvp

zdwk9cvp1#

你调查过房地产资源吗?

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

从他们的医生那里:
如果给定的属性键存在于多个.properties文件中,则最后处理的@propertysource注解将“win”并重写。
基本上你在这里说的是:从类路径加载.properties,但是也从这个外部位置加载.properties,如果找不到它就忽略后者。它应该重写您在外部文件中声明的属性。
我还没测试过,希望能成功。

相关问题