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

2022-08-31 09:55:28

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

  • 我的应用程序-DAO
  • myApp-jabber

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

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

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

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

我很好奇听到来自stackoverflow社区的解决方案/想法。


答案 1

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

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

答案 2

我知道这是一个老问题,但该物业不适合我,我不知道为什么。ignore-unresolvable

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

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

ignore-resource-not-found="true"

以防其他人碰到这个。