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

Posted

技术标签:

【中文标题】在多个项目/模块中使用多个属性文件(通过 PropertyPlaceholderConfigurer)【英文标题】:Using multiple property files (via PropertyPlaceholderConfigurer) in multiple projects/modules 【发布时间】:2011-03-25 03:27:30 【问题描述】:

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

myApp-DAO myApp-jabber

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

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

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

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

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

【问题讨论】:

【参考方案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/

【讨论】:

是否需要指定订单?我试过这个,jvm抱怨了。【参考方案2】:

如果您确保在所涉及的每个上下文中的每个占位符都忽略不可解析的键,那么这两种方法都有效。例如:

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

【讨论】:

这是一个有用的条目,可以帮助您进一步解决这些问题:tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html 谢谢!! ignore-unresolvable="true" 正是我所需要的,它成功了! 如果将所有文件添加到 1 个标签中,则不需要ignore-unresolvable="true",否则需要。 你能解释一下ignoreUnresolvablePlaceholders的含义吗?什么是不可解析的占位符? PropertySourcesPlaceholderConfigurer 是自 Spring 3.1 以来的默认支持实现,因此使用而不是 PropertyPlaceholderConfigurer 作为 bean 实现类是明智的。【参考方案3】:

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

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

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

ignore-resource-not-found="true"

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

【讨论】:

ignore-unresolvableignore-resource-not-found 有不同的用途。为了防止属性 file 不存在时出现错误,请使用ignore-resource-not-found="true"。为防止在使用文件中不存在的属性时出错,请使用ignore-unresolvable="true"。如果您有多个文件,每个文件都包含部分属性集,并且每个文件可能存在也可能不存在,您将需要同时使用这两个文件。【参考方案4】:

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

【讨论】:

我尝试使用两个 元素,但 spring 抱怨它无法识别指定的属性。我必须实施公认的答案才能正常工作。【参考方案5】:

PropertiesPlaceholderConfigurer bean 有一个名为“propertiesArray”的替代属性。使用它而不是“properties”属性,并使用属性引用的&lt;array&gt; 对其进行配置。

【讨论】:

以上是关于在多个项目/模块中使用多个属性文件(通过 PropertyPlaceholderConfigurer)的主要内容,如果未能解决你的问题,请参考以下文章

Spring 3.0 中的多个属性文件

如何在logback.xml中自定义动态属性

xml 属性文件中的多个部分

具有多个项目的声纳

将表单选择中的多个属性设置为状态

如何在XML属性中传递多个值