外部属性工作但不覆盖内部属性中的现有默认值

时间:2017-02-01 10:53:21

标签: java spring maven tomcat

我有一个多模块maven项目,每个模块都是一个jar,它有自己的上下文文件和一组捆绑在JAR中的默认属性。

基本上在核心模块中我有这个:

<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:core.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

现在我有另一个模块,通过加载所有相关的XML并添加自己的配置文件来构建应用程序

<import resource="classpath*:core-context.xml" />


<bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>#{systemEnvironment['foo_bar']}</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

除了具有默认值的配置文件之外,我的所有配置文件都正常工作。我无法在application.properties或系统变量指向的文件中覆盖它们。

我尝试使用spring.config.location强制配置文件。我确实在tomcat中看到消息说我有配置-Dspring.config.file=file:///...(windows路径)。但是春天完全无视它(Spring的日志中没有消息)。

我尝试切换到PropertySources类而没有更多成功。

我非常希望不必删除所有默认属性并将所有内容放在外部文件中,因为很多参数都是应用程序的内部参数,并且对客户端没有任何价值。

那么我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

好吧,我在几个小时之后发现了这么简单的事情。 这是诀窍:在导入之前声明属性占位符。

当你在一个属性占位符中声明文件时,它是最后一次获胜,看起来恰恰相反:第一名持有者获胜。

    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>#{systemEnvironment['foo_bar']}</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

 <import resource="classpath*:core-context.xml" />