我有两个项目 - 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}
答案 0 :(得分:2)
问题是您的第一个PropertyPlaceHolderConfigurer
正在尝试解决需要由第二个解析的占位符。
您可以为每个人使用不同的前缀(例如!{
而不是${
),或者设置
ignore-unresolvable="true"
在第一个 - 然后它将决议留给另一个。