当前位置: 首页 > 知识库问答 >
问题:

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

子车鸿运
2023-03-14

我已经建立了一个spring boot项目。

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

@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的内容。属性文件如下所示:

someUrls.urlA=someURL
someUrls.urlB=someOtherURL

在项目中,在资源文件夹(和测试资源文件夹)中,我提供了一个abc.properties文件。一旦构建并运行,程序就可以按预期访问abc.properties文件中的属性(也可以在测试中正确访问)——它们很好地映射到我的url映射。

到现在为止,一直都还不错。

但是,我在属性类中引用的URL并不总是相同的。在某些部署中,我想覆盖它们。使用我的application.properties文件中指定的属性,这很容易;只需在我运行应用程序的同一个(根)文件夹中有另一个外部application.properties文件,就会覆盖我自动放入的任何属性。

我想做的是有时也放一个外部abc。属性文件,并使其覆盖abc。属性属性。当然我试过了,但是abc的房产。内置到jar中的属性文件将被保留而不会被覆盖。事实上,我不确定spring boot程序是否识别出另一个外部abc。属性文件在其根文件夹中。

我似乎没完没了地读到关于如何在没有成功的情况下实现这一目标的文章。我还尝试在我的应用程序中指定以下内容。属性,但它没有什么不同(即使它确实有效,也不太理想,因为我不希望在所有情况下都指定直接路径)。

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

如果我不得不猜测的话,问题是在properties类中,我指向“classpath:…”外部文件实际上不在类路径上,因为它是。。。。外部良好。

但是spring boot知道如何在其根应用程序文件夹中查找覆盖的应用程序。所以我希望它也能找到其他属性文件来覆盖?我只是不知道如何实现这一点。

是的,我特别希望我的属性在这个abc.properties文件中,而不是在应用程序属性中。

共有1个答案

章青青
2023-03-14

你调查过房地产资源吗?

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

从他们的文档:

在给定属性键存在于多个中的情况下。属性文件,最后处理的@PropertySource注释将“赢”并覆盖。

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

还没有测试过这个,所以希望它能成功。

 类似资料:
  • 我有一个外部属性文件,该文件存在于哈希科普中,并且正在使用注释将其拉到Spring Boot。在我的Spring启动应用程序中,有特定于配置文件文件。现在我想要的是配置优先于这些特定于配置文件的配置。 我已经通读了Spring Boot外部配置文档-https://docs.spring.io/spring-boot/docs/2.1.13.RELEASE/reference/html/boot-

  • 我希望在运行时传递变量,一旦war文件部署在tomcat上。如何使用classplath中的application.properties以及另一个属性文件ex。abcd.properties位于specific directory.am基本上希望设置额外的类路径,并从该路径中的属性文件中读取值,以及war部署的默认类路径位置。 我使用Spring boot。其中一种方法是将所有属性传递到数据库端,

  • 我正在开发一个Spring集成/引导应用程序。我正在使用一个多文档(src/main/Resources/application.yml)来设置几个配置类的默认值(用@ConfigurationProperties注释)。pplicaiton.yml带有默认值,其中一些需要被覆盖,具体取决于环境。 我可以在目录中使用Java系统属性(-D...=...)、Spring“属性”(--...=...)

  • 我想覆盖我在Quarkus应用程序的配置文件中配置的属性。 我怎样才能做到这一点?

  • 这是正确的吗? 如果是这样,考虑到这是一场战争,我如何将这些属性注入我的Spring Boot应用程序?

  • 我希望外部文件的属性覆盖内部值(如果它们存在于外部文件中)。 在我的configuration类中,我使用PropertySource注释设置文件: