创建 PropertyPlaceHolderConfigurer 的多个实例 - Spring
Creating multiple instances of PropertyPlaceHolderConfigurer - Spring
我在应用程序服务器 (glassfish) 中部署了 2 个不同的应用程序。一个是 jar 文件,另一个是 war 应用程序。这两个应用程序都引用一个属性文件 (data.properties)。为了读取属性文件,我在各自的上下文文件(business-beans.xml 和 applicationContext.xml).部署应用程序后,我能够在一个应用程序中加载属性文件,而另一个 Web 应用程序抛出“无法解析占位符 'sw.throttle.enable'
问题 -
- 如何解决问题?
- 在两个位置加载相同的属性文件是否不正确?
- 有没有一种方法可以在一个上下文中加载属性文件,而在另一个 bean 定义文件中使用第一个的引用?
business.beans
的快照
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
</bean>
属性 引用如下 business.beans
<bean id="mService" class=" com.test.business.mService">
<property name="throttlingEnabled" value="${sw.throttle.enable}"/>
</bean>
applicationContext.xml
的快照
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
</bean>
属性 引用如下 applicationContext.xml
<bean id="downloadService" class="com.test.downloadService"
init-method="startUp" destroy-method="shutDown"
p:throttlingEnabled="${sw.throttle.enable}" />
包含 business.beans 的应用程序部署良好,但包含 applicationContext.xml 的应用程序抛出 运行 时间错误 "could not resolve placeholder sw.throttle.enable"
备注 -
- 这两个应用程序都部署在 OsGi 上下文中。
- Spring版本为3.0.1
编辑 -
applicationContext.xml 有另一个定义如下的 bean。这可能是原因吗?
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>
通过将 "ignoreUnresolvablePlaceholders" 设置为 "true" 解决了该问题。显然 business.beans 与问题无关
下面是解决问题的修改配置
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceHolders" value="true"
</bean>
感谢Whosebug的回答+1
我在应用程序服务器 (glassfish) 中部署了 2 个不同的应用程序。一个是 jar 文件,另一个是 war 应用程序。这两个应用程序都引用一个属性文件 (data.properties)。为了读取属性文件,我在各自的上下文文件(business-beans.xml 和 applicationContext.xml).部署应用程序后,我能够在一个应用程序中加载属性文件,而另一个 Web 应用程序抛出“无法解析占位符 'sw.throttle.enable'
问题 -
- 如何解决问题?
- 在两个位置加载相同的属性文件是否不正确?
- 有没有一种方法可以在一个上下文中加载属性文件,而在另一个 bean 定义文件中使用第一个的引用?
business.beans
的快照<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
</bean>
属性 引用如下 business.beans
<bean id="mService" class=" com.test.business.mService">
<property name="throttlingEnabled" value="${sw.throttle.enable}"/>
</bean>
applicationContext.xml
的快照<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
</bean>
属性 引用如下 applicationContext.xml
<bean id="downloadService" class="com.test.downloadService"
init-method="startUp" destroy-method="shutDown"
p:throttlingEnabled="${sw.throttle.enable}" />
包含 business.beans 的应用程序部署良好,但包含 applicationContext.xml 的应用程序抛出 运行 时间错误 "could not resolve placeholder sw.throttle.enable"
备注 -
- 这两个应用程序都部署在 OsGi 上下文中。
- Spring版本为3.0.1
编辑 - applicationContext.xml 有另一个定义如下的 bean。这可能是原因吗?
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>
通过将 "ignoreUnresolvablePlaceholders" 设置为 "true" 解决了该问题。显然 business.beans 与问题无关
下面是解决问题的修改配置
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="placeholderPrefix" value="${sw." />
<property name="location" value="file:///etc/data.properties" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceHolders" value="true"
</bean>
感谢Whosebug的回答+1