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


104

我们目前正在编写一个应用程序,该应用程序分为多个项目/模块。例如,让我们采用以下模块:

  • myApp-DAO
  • myApp-jabber

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

现在出现了主要应用程序,其中包括myApp-DAO和myApp-jabber。它读取所有上下文文件并启动一个大的Spring上下文。不幸的是,每个上下文似乎只能有一个PropertyPlaceholderConfigurer,因此,无论哪个模块首先加载,都能够读取其连接参数。另一个引发异常,并显示诸如“无法解析占位符'jabber.host'”之类的错误。

我有点理解问题所在,但是我真的不知道解决方案-还是我的用例的最佳实践。

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

我很想知道来自stackoverflow社区的解决方案/想法。

Answers:


182

如果确保在每个涉及的上下文中每个占位符都忽略了无法解析的密钥,那么这两种方法都可以使用。例如:

<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>

11
这是有关此主题的有用条目,应该可以帮助您进一步解决这些问题:tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Tim Hennekey,2010年

2
谢谢!!ignore-unresolvable =“ true”正是我所需要的,并且可以解决问题!
black666 2010年

1
如果将所有文件都添加到1个标签中,则不需要event ignore-unresolvable="true",否则需要。
埃里克·王

你能解释一下的意思ignoreUnresolvablePlaceholders吗?什么是无法解决的占位符?
emeraldhieu 2015年

PropertySourcesPlaceholderConfigurer是Spring 3.1以来的默认支持实现,因此明智的做法是将其PropertyPlaceholderConfigurer用作bean实现类。
jihor

18

我知道这是一个老问题,但是 ignore-unresolvable物业对我不起作用,我也不知道为什么。

问题是我需要一个外部资源(如location="file:${CATALINA_HOME}/conf/db-override.properties"),ignore-unresolvable="true"在这种情况下,它无法完成工作。

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

ignore-resource-not-found="true"

以防万一其他人碰到这个。


3
ignore-unresolvableignore-resource-not-found达到不同的目的。为防止属性文件不存在时发生错误,请使用ignore-resource-not-found="true"。为了防止在使用文件中不存在的属性时出现错误,请使用ignore-unresolvable="true"。如果您有多个文件,每个文件都包含部分属性集,并且每个文件可能存在或不存在,则需要同时使用两者。
datguy 2014年

8

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


我尝试使用两个<context:property-placeholder />元素,并且spring抱怨它无法识别指定的属性。我必须执行公认的答案才能起作用。
糊糊的


2

我尝试了以下解决方案,它可以在我的机器上使用。

<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/


是否指定订单?我尝试了这个,jvm抱怨了。
糊糊的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.