Spring @PropertySources值不会覆盖

Nik*_*ero 7 java spring spring-mvc spring-boot

我将我的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文件夹中

的context.xml

<Parameter name="spring.profiles.active" value="local" override="false"/>
Run Code Online (Sandbox Code Playgroud)

catalina.properties

shared.loader=${catalina.home}/property_files
Run Code Online (Sandbox Code Playgroud)

AppConfig.java

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

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

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

小智 5

将默认配置/属性放置在不同的文件中,而不是 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
}
Run Code Online (Sandbox Code Playgroud)

在 Spring 4.x 和 Java 8 中测试


Kar*_*waj 4

不要使用许多 propertySource 注释,而是在启动应用程序时尝试设置

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 {}

    }
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案可能会起作用。但我发现我的问题是由目录优先级引起的。事实证明,根类路径上的属性文件比任何属性文件都具有更高的优先级,无论它们声明的顺序如何。 (2认同)