弹簧@PropertySources值不覆盖

2022-09-04 03:58:05

我正在将我的Spring Boot应用程序部署为Tomcat中的WAR文件。我期望我的 application-local.properties 覆盖也存在于我的 application.properties 文件中的值。但是,似乎只有当 application.properties 中不存在这些键时,才会读取 application-local.properties 中的值。我的 application.properties 文件位于我的项目的 src/main/resources/ 中,application-local.properties 位于 ${catalina.home}/property_files/com/demo/config 文件夹中

上下文.xml

<Parameter name="spring.profiles.active" value="local" override="false"/>

卡塔利娜.属性

shared.loader=${catalina.home}/property_files

应用配置.java

@Configuration
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:com/demo/config/application-${spring.profiles.active}.properties")
})
public class AppConfig extends WebMvcConfigurerAdapter {
}

编辑1:实际上,我的环境相关属性文件正在加载。但它不会覆盖内部属性文件中的任何值。

编辑2:感谢您的所有建议。但是我发现我的问题是由目录优先级引起的。事实证明,根类路径上的属性文件比任何属性文件都具有更高的优先级,无论它们的声明顺序如何。


答案 1

而不是 application.properties,请将默认配置/属性放在其他文件中。在 application.properties 中定义的属性值似乎具有最高的优先级。

因此,像这样的东西将起作用:

@Configuration
@PropertySource("classpath:application-env.properties")
@PropertySource(value="file:${application.home}/application-env.properties",ignoreResourceNotFound=true)
public class GlobalSettings {
  //configuration values
}

在春季 4.x 和 Java 8 中测试


答案 2

而不是使用许多属性源注释在启动应用程序时尝试设置

java -jar myproject.jar --spring.config.location={your_location}/application.properties,classpath:/override.properties.

您作为命令行的一部分提供的任何内容都将具有最高优先级。
或者做这样的事情并测试

    @Configuration
    @PropertySource("classpath:application.properties")
    public class DefaultConfiguration {}
    @Configuration
    @PropertySource("classpath:{environment_specific_property_name}.properties")
    public class EnvironmentSpecific{

        @Configuration
        @Import(DefaultConfiguration .class)
        static class Configuration {}

    }

推荐