gpt4 book ai didi

spring - 上下文 :property-placeholder doesn't resolve references

转载 作者:行者123 更新时间:2023-12-04 08:55:43 27 4
gpt4 key购买 nike

我有下一个applicationContext.xml类路径根目录下的文件:

<context:annotation-config />

<context:property-placeholder location="classpath:props/datasource.properties" />

<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:url="${jdbc.url}"
p:driverClassName="${jdbc.driverclass}"
p:validationQuery="SELECT sysdate FROM dual" />

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="datasource"
p:mapperLocations="classpath:mappers/*-mapper.xml" />

<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="datasource" />

<bean id="mappeScannerConfigurere" class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:sqlSessionFactory-ref="sqlSessionFactory"
p:basePackage="com.mypackage" />
props/datasource.properties也存在于类路径的根目录中,内容如下:
jdbc.url=myjdbcurl
jdbc.driverclass=myClass
jdbc.username=myUserName
jdbc.password=myPassword

我有一个 spring 托管测试,我通过下一个注释声明使用前面提到的 applicationContext.xml:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})

当我调用测试方法时,我从 Spring 得到下一个错误:
org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverclass}'

据我了解,sping 没有解析对 jdbc.driverclass 的引用。
我做错了什么?

PS:我正在使用spring 3.2.3.RELEASE

**

编辑

**

或许问题出在 MapperScannerConfigurer .这是一个 BeanDefinitionRegistryPostProcessor正如Javadoc所说:

Extension to the standard BeanFactoryPostProcessor SPI, allowing for the registration of further bean definitions before regular BeanFactoryPostProcessor detection kicks in



所以 MapperScannerConfigurer通过带有 BeanFacoryPostProcessor 的 sqlSessionFactory 实例化数据源对象(负责 <context:property-placeholder/> )尚未使用。
所以我的问题转变为如何重新排序 BeanFacoryPostProcessor来自 <context:property-placeholder/>BeanDefinitionRegistryPostProcessor ( MapperScannerConfigurer)?

解决

经过几个小时的调查,我找到了解决方案:

正如我之前所说的 MapperScannerConfigurerBeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor 之前触发负责 <context:property-placeholder/> .因此,在创建 MapperScannerConfigurer 期间,对外部属性的引用将不会被解析。在这种情况下,我们必须将数据源的创建推迟到 BeanFactoryPostProcessor 之后的时间。已应用。我们可以通过以下几种方式做到这一点:
  • 删除 p:sqlSessionFactory-ref="sqlSessionFactory"来自 MapperScannerConfigurer .在这种情况下,将不会在 MapperScannerConfigurer 之前创建数据源对象。 , 但在 BeanFactoryPostProcessor 之后负责<context:property-placeholder/> .如果 applicationContext 中有多个 sqlSessionFactory,那么可能会有些麻烦
  • 在高于 1.0.2 的 mybatis-spring 模块版本中,可以设置 sqlSessionFactoryBeanName而不是 sqlSessionFactory .它有助于解决 BeanFactoryPostProcessor 的 PropertyPlaceHolder 问题.这是mybatis-spring doc中描述的解决此问题的推荐方法
  • 最佳答案

    我遇到了同样的问题并遇到了这篇文章,但我无法像 mak 那样解决它。最终为我工作的是将 ignoreUnresolvablePlaceholders 属性值设置为 true。

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
    <value>classpath:database.properties</value>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

    我也在使用 Spring 3.2.3.RELEASE。我意识到这篇文章已经超过 4 个月了,但我想有人可能会觉得它很有用。

    关于spring - 上下文 :property-placeholder doesn't resolve references,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17512596/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com