Spring 解析 属性 文件位置需要解析那些属性

Spring resolved property file location needs to resolve those properties

我正在使用 Spring 版本 4.0.6.RELEASE 并试图让 spring 从属性文件中读取并使用其中一个已解析的属性为另一个属性提供位置文件。我的 spring.xml 文件包含以下内容:

    <bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>classpath:version.properties</value>
            <!- The below file contains the another file location -->
            <value>file:${catalina.base}/conf/instance.properties</value>
            <value>${another.file.location}</value>

        </list>
    </property>
    <property name="ignoreResourceNotFound" value="true"/>
</bean>

instance.properties 包含:

account.id=BlahBlahBlah
another.file.location=file:/Users/beardman/.myapp/local.properties

and /Users/beardman/.myapp/local.properties 包含:

magic.number=3
database.endpoint=blah

我不断收到以下警告:

WARN  [main] o.s.b.f.c.PropertyPlaceholderConfigurer Could not load properties from ServletContext resource [/${another.file.location}]: Could not open ServletContext resource [/${another.file.location}]

调试我的代码时,我可以看到 account.id 已正确注入,但我永远无法让 magic.number 或 database.endpoint 显示出来。如何让 spring 使用 instance.properties 文件中已解析的 属性 作为 another.file.location 的值?

编辑:添加了 属性 文件内容

Spring 默认情况下用系统属性替换 属性 占位符。由于您还想使用在外部文件中定义的属性,因此您需要创建一个 PropertyPlaceholderConfigurer
此标记是 shorthand,但如果需要更多控制,您可以将 PropertyPlaceholderConfigurer 定义为 bean。在您的 applicationProperties bean

之前添加它
<context:property-placeholder location="file:${catalina.base}/conf/instance.properties"/>

请注意,文件中的属性将覆盖默认模式下的系统属性。您可以通过将属性 systemPropertiesMode="override" 添加到 property-placeholder 元素

来指定首先检查系统属性