我正在使用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>
但我得到同样的错误。
答案 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变量。