我们目前正在编写一个分为多个项目/模块的应用程序。例如,让我们采用以下模块:
每个模块都有自己的Spring上下文xml文件。对于DAO模块,我有一个PropertyPlaceholderConfigurer,它使用必要的db连接参数读取属性文件。在jabber模块中,我还有一个用于jabber连接属性的PropertyPlaceHolderConfigurer。
现在主要的应用程序包括myApp-DAO和myApp-jabber。它读取所有上下文文件并启动一个大的Spring上下文。不幸的是,似乎每个上下文只能有一个PropertyPlaceholderConfigurer,因此首先加载的模块能够读取它的连接参数。另一个抛出异常,出现“无法解析占位符'jabber.host'”
这样的错误我有点明白问题是什么,但我真的不知道解决方案 - 或者是我用例的最佳做法。
我如何配置每个模块,以便每个模块都能加载自己的属性文件?现在我已经将PropertyPlaceHolderConfigurer移出了单独的上下文文件,并将它们合并到主应用程序的上下文中(使用单个PropertyPlaceHolderConfigurer加载所有属性文件)。这很糟糕,因为现在每个使用dao模块的人都必须知道,他们在上下文中需要一个PropertyPlaceHolderConfigurer .. dao模块中的集成测试也会失败等。
我很想知道来自stackoverflow社区的解决方案/想法。
答案 0 :(得分:177)
如果您确保在所涉及的每个上下文中,每个占位符都忽略了无法解析的密钥,那么这两种方法都有效。例如:
<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>
答案 1 :(得分:18)
我知道这是一个老问题,但ignore-unresolvable
属性对我不起作用,我不知道为什么。
问题是我需要一个外部资源(类似location="file:${CATALINA_HOME}/conf/db-override.properties"
),ignore-unresolvable="true"
在这种情况下不能完成工作。
忽略缺少的外部资源需要做的是:
ignore-resource-not-found="true"
以防万一其他人碰到这个。
答案 2 :(得分:8)
您可以拥有多个<context:property-placeholder />
元素,而不是显式声明多个PropertiesPlaceholderConfigurer bean。
答案 3 :(得分:4)
PropertiesPlaceholderConfigurer
bean有一个名为“propertiesArray”的替代属性。使用此属性代替“properties”属性,并使用<array>
属性引用对其进行配置。
答案 4 :(得分:1)
我尝试了下面的解决方案,它适用于我的机器。
<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />
<context:property-placeholder location="classpath*:general.properties" order="2"/>
如果出现多个元素 Spring上下文,应该有一些最佳实践 如下:
需要指定order属性来修复其中的顺序 这些由Spring处理所有属性占位符减去最后一个 一个(最高级别)应该允许
ignore-unresolvable=”true”
解决机制在没有上下文的情况下传递给其他人 抛出异常
来源:http://www.baeldung.com/2012/02/06/properties-with-spring/