PropertyPlaceholderConfigurer与Tomcat& ContextLoaderListener的

时间:2011-09-19 20:03:12

标签: java spring tomcat

我正在使用PropertyPlaceholderConfigurer和Tomcat& ContextLoaderListener的。

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

<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>

[Thread-2] 15:50:16 ERROR 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>

但我得到同样的错误。

4 个答案:

答案 0 :(得分:2)

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

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

或者您可以继承PropertyPlaceholderConfigurer并覆盖setLocation()来处理占位符。

答案 1 :(得分:0)

设置完整的位置,例如-DpropFileLocation=classpath:env1.properties-DpropFileLocation=classpath:env2.properties,而不仅仅是其中的一部分:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="location" value="${propFileLocation}"/>
</bean>

答案 2 :(得分:0)

您需要将环境变量CATALINA_OPTS或JAVA_OPTS设置为-Denv = test。执行此操作的最佳方法是创建setenv.bat(如果您使用的是unix,则为.sh)并在此处添加此环境变量定义。

如果将它作为参数传递给startup.bat(.sh),它将不会生效,我假设你在做什么。

答案 3 :(得分:0)

此论坛上有一个similar question,需要在属性文件中进行外部化。查看this solution。它认为你的问题是相似的,而不是将env作为系统变量传递,将其设置为env变量。