一尘不染

带有Tomcat和ContextLoaderListener的PropertyPlaceholderConfigurer

tomcat

我在Tomcat和ContextLoaderListener中使用PropertyPlaceholderConfigurer。

这有效(使用硬编码的属性文件的名称):

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/test.properties"/>
</bean>

但这(用$ {env}替换属性文件的名称):

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties"/>
</bean>

[线程2] 15:50:16错误ContextLoader-
上下文初始化失败org.springframework.beans.factory.BeanInitializationException:无法加载属性;无法加载属性。嵌套异常是java.io.FileNotFoundException:类路径资源[properties
/ $ {env} .properties]无法打开,因为它不存在

我知道文件在那里,因为当我对它进行硬编码时它可以工作。

启动Tomcat并设置环境变量时,我尝试使用-Denv =
test。我使用自己的main方法而不是ContextLoaderListener在Tomcat之外工作。

我可能做错了什么?我可以使用context.xml或web.xml中的条目代替-Denv = test来实现同一目的吗?

谢谢

PS我也尝试过:

<bean id="initialcorePropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName">
        <value>SYSTEM_PROPERTIES_MODE_OVERRIDE</value>
    </property>
    <property name="searchSystemEnvironment">
        <value type="boolean">true</value>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<bean id="corePropertyConfigurer" depends-on="initialcorePropertyConfigurer" lazy-init="true"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:properties/${env}.properties" />
</bean>

但我得到同样的错误。


阅读 247

收藏
2020-06-16

共1个答案

一尘不染

您不能在PropertyPlaceholderConfigurer定义中使用属性占位符。鸡肉和鸡蛋。

您可以使用 #{ systemProperties['env'] }

或者,您可以子类化PropertyPlaceholderConfigurer并重写setLocation()以处理占位符。

2020-06-16