我在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>
但我得到同样的错误。
您不能在PropertyPlaceholderConfigurer定义中使用属性占位符。鸡肉和鸡蛋。
您可以使用 #{ systemProperties['env'] }
#{ systemProperties['env'] }
或者,您可以子类化PropertyPlaceholderConfigurer并重写setLocation()以处理占位符。
PropertyPlaceholderConfigurer
setLocation()