我正在使用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
和/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文件中的resolved属性作为another.file.location的值?
编辑:添加了属性文件内容
答案 0 :(得分:0)
默认情况下,Spring将属性占位符替换为系统属性。由于您还想使用外部文件中定义的属性,因此需要创建PropertyPlaceholderConfigurer
此标记是简写,但如果需要更多控制,可以将PropertyPlaceholderConfigurer定义为bean。在applicationProperties bean之前添加它
<context:property-placeholder location="file:${catalina.base}/conf/instance.properties"/>
请注意,文件中的属性将覆盖默认模式下的系统属性。您可以通过将属性systemPropertiesMode="override"
添加到property-placeholder
元素