0

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

project-web -- 基于 Spring 集成的项目,在其 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 配置文件,并且在 project-service 项目中,我进行了以下配置:

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

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

<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 时(project-service 将作为 .jar 文件包含在 project-web 的 WEB-INF/lib 文件夹中),它在启动过程中抛出错误,说 can't resolve ${db.type }:

org.springframework.beans.factory.BeanDefinitionStoreException:在类路径资源 [META-INF/spring/applicationContext-data.xml] 中定义的名称为 'dataSource' 的 bean 定义无效:无法解析字符串值中的占位符 'db.type' 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. 发布] ....................

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

4

1 回答 1

2

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

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

ignore-unresolvable="true"

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

于 2013-02-06T22:06:52.050 回答