Spring上下文:property-placeholder无法解析嵌套变量

时间:2013-02-06 20:45:53

标签: spring spring-integration

我有两个项目 - project-web和project-service,它们都使用Spring核心3.1.3并且具有从相应属性文件加载属性的配置:

project-web - 基于Spring Integration的项目,在其spring配置文件中:

<context:property-placeholder location="WEB-INF/spring-integration/spring-integration.properties" ignore-resource-not-found="true" />    
<import resource="classpath*:META-INF/spring/applicationContext.xml" />

其中导入包括来自project-service的spring配置文件,在项目服务项目中,我有以下配置:

<context:property-placeholder location="classpath:META-INF/application.properties, classpath:META-INF/db.properties"  ignore-resource-not-found="true"/>
<import resource="classpath:META-INF/spring/applicationContext-data.xml"/>

其中导入包含DAO的Spring配置,在applicationContext-data.xml中我有:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
       <property name="driverClassName" value="${db.${db.type}.driver}" />
       <property name="url" value="${db.${db.type}.url}"/>
       <property name="username" value="${db.${db.type}.username}" />
       <property name="password" value="${db.${db.type}.password}" />       
    </bean>

当我运行项目服务的单元测试时,一切都很好,所有变量都正确解析没有任何问题。但是当我运行project-web(项目服务将作为.jar文件包含在project-web的WEB-INF / lib文件夹中)时,它会在启动时抛出错误,说无法解析$ {db.type }:

org.springframework.beans.factory.BeanDefinitionStoreException:在类路径资源[META-INF / spring / applicationContext-data.xml]中定义名称为'dataSource'的bean定义无效:无法解析占位符'db.type'in字符串值“db。$ {db.type} .driver”     在org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)〜[spring-beans-3.1.3.RELEASE.jar:3.1.3.RELEASE]     在org.springframework.context.support.PropertySourcesPlaceholderConfigurer.processProperties(PropertySourcesPlaceholderConfigurer.java:174)〜[spring-context-3.1.3.RELEASE.jar:3.1.3.RELEASE]     在org.springframework.context.support.PropertySourcesPlaceholderConfigurer.postProcessBeanFactory(PropertySourcesPlaceholderConfigurer.java:151)〜[spring-context-3.1.3.RELEASE.jar:3.1.3.RELEASE] ......................

注意:我无法在project-web中声明所有内容,因为项目服务也将被其他项目使用。任何人都知道为什么项目服务在单独运行时会起作用,但在项目网络中包含时却不行?它无法解析嵌套变量$ {db.type}

1 个答案:

答案 0 :(得分:2)

问题是您的第一个PropertyPlaceHolderConfigurer正在尝试解决需要由第二个解析的占位符。

您可以为每个人使用不同的前缀(例如!{而不是${),或者设置

ignore-unresolvable="true"

在第一个 - 然后它将决议留给另一个。