在多个项目/模块中使用多个属性文件(通过PropertyPlaceholderConfigurer)

我们目前正在编写一个分为多个项目/模块的应用程序。 例如,我们来看看下面的模块:

  • 对myApp-DAO
  • 对myApp-叽里咕噜

每个模块都有自己的Spring上下文xml文件。 对于DAO模块,我有一个PropertyPlaceholderConfigurer,它使用必要的db连接参数读取一个属性文件。 在jabber模块中,我还有一个用于jabber连接属性的PropertyPlaceHolderConfigurer。

现在主要的应用程序包括myApp-DAO和myApp-jabber。 它读取所有的上下文文件并启动一个大的Spring上下文。 不幸的是,似乎每个上下文只能有一个PropertyPlaceholderConfigurer,因此无论哪个模块首先被加载,都能够读取它的连接参数。 另一个抛出一个exception,如“无法parsing占位符'jabber.host'”

我很清楚问题是什么,但是我并不真正了解解决scheme – 或者是我的用例的最佳实践。

我如何configuration每个模块,使每个模块能够加载自己的属性文件? 现在我已经将PropertyPlaceHolderConfigurer从单独的上下文文件中移出,并将它们合并到主应用程序的上下文中(使用一个PropertyPlaceHolderConfigurer加载所有的属性文件)。 这很糟糕,因为现在每个使用dao模块的人都必须知道,他们在上下文中需要一个PropertyPlaceHolderConfigurer ..另外,dao模块中的集成testing也会失败等等。

我很想听到从stackoverflow社区解决scheme/想法..

如果你确保在每个涉及到的上下文中,每个占位符忽略了不可parsing的密钥,那么这两种方法都可以工作。 例如:

<context:property-placeholder location="classpath:dao.properties, classpath:services.properties, classpath:user.properties" ignore-unresolvable="true"/> 

要么

  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:dao.properties</value> <value>classpath:services.properties</value> <value>classpath:user.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true"/> </bean> 

我知道这是一个古老的问题,但ignore-unresolvable财产不适合我,我不知道为什么。

问题是我需要一个外部资源(比如location="file:${CATALINA_HOME}/conf/db-override.properties" ),而ignore-unresolvable="true"在这种情况下不会执行这个任务。

忽略缺失的外部资源需要做的是:

 ignore-resource-not-found="true" 

以防万一碰到这个。

您可以拥有多个<context:property-placeholder />元素,而不是显式声明多个PropertiesPlaceholderConfigurer bean。

PropertiesPlaceholderConfigurer bean有一个名为“propertiesArray”的替代属性。 使用它而不是“属性”属性,并使用属性引用的<array>来configuration它。

我试过下面的解决scheme,它在我的机器上工作。

 <context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" /> <context:property-placeholder location="classpath*:general.properties" order="2"/> 

如果在Spring环境中存在多个元素,则应遵循一些最佳实践:

需要指定顺序属性来修正Spring处理这些顺序的所有属性占位符减去最后一个顺序(最高顺序)应该具有ignore-unresolvable=”true”以允许parsing机制传递给上下文中的其他人而不会抛出exception

来源: http : //www.baeldung.com/2012/02/06/properties-with-spring/