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

bla*_*666 98 java spring properties

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

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

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

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

我有点理解问题是什么,但我真的不知道解决方案 - 或者是我用例的最佳实践.

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

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

Tim*_*key 177

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

<context:property-placeholder
location="classpath:dao.properties,
          classpath:services.properties,
          classpath:user.properties"
ignore-unresolvable="true"/>
Run Code Online (Sandbox Code Playgroud)

要么

    <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>
Run Code Online (Sandbox Code Playgroud)

  • 以下是有关该主题的有用条目,可帮助您进一步解决这些问题:http://tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html (10认同)
  • 谢谢!!ignore-unresolvable ="true"正是我所需要的,它就是诀窍! (2认同)
  • 如果您将所有文件添加到 1 个标签中,则不需要`ignore-unresolvable="true"`,否则不需要。 (2认同)

Rau*_*ene 18

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

问题是我需要一个外部资源(类似的东西location="file:${CATALINA_HOME}/conf/db-override.properties")并且ignore-unresolvable="true"在这种情况下不能完成工作.

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

ignore-resource-not-found="true"
Run Code Online (Sandbox Code Playgroud)

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

  • `ignore-unresolvable`和`ignore-resource-not-found`用于不同的目的.要在属性**文件**不存在时防止出错,请使用`ignore-resource-not-found ="true"`.为了防止在file_中使用不存在的属性时出错,请使用`ignore-unresolvable ="true"`.如果您有多个文件,每个文件都包含部分属性集,并且每个文件可能存在,也可能不存在,则需要同时使用这两个文件. (3认同)

ear*_*las 8

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