使用context:Spring-EL的property-placeholder位置

时间:2011-08-01 14:55:00

标签: spring spring-el

我正在尝试使用property-placeholder加载一些属性文件,我想使用系统属性指定其中一个文件的名称,以便我可以根据我的应用程序的环境加载不同的文件跑进来。

最初我尝试了以下内容:

<context:property-placeholder location="classpath:environment_common.properties,classpath:environment_${app_env}.properties" />

我验证了系统属性(app_env)设置正确(例如“bar”),但Spring正在加载错误的文件(例如,environment_foo.properties)。

我接下来尝试使用SpEL:

<context:property-placeholder
        location="#{ 'classpath:environment_common.properties,classpath:environment_'.concat(systemProperties['app_env'] }.properties) }" />

但似乎context:property-placeholder不支持SpEL:

java.io.FileNotFoundException: Could not open ServletContext resource [/#{'classpath:environment_common.properties]

看起来好像context:property-placeholder有自己的解析器来寻找逗号来分隔多个属性文件,但它并没有首先将值传递给SpEL来评估它。

我应该如何使用context:property-placeholder,还是应该绕过它并直接使用PropertyPlaceHolderConfigurer

2 个答案:

答案 0 :(得分:1)

我从未尝试过直接在property-placeholder元素中使用SpEL。不过,似乎有a bug申请。作为一个相当简单的解决方法:

<context:property-placeholder properties-ref="props" />
<util:properties id="props" location="#{ your expression here }"/>

答案 1 :(得分:1)

我今天遇到了这个问题。这是我的解决方案:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" 
        value="classpath:#{(T(java.lang.System).getProperty('my.property', 'development.properties'))}"/>
</bean> 

我没有使用预定义的变量systemProperties,但如果你愿意,可以假设你可以。