【问题标题】:context:property-placeholder doesn't resolve references上下文:属性占位符不解析引用
【发布时间】:2013-07-07 13:30:51
【问题描述】:

我在类路径的根目录中有下一个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 所说:

标准 BeanFactoryPostProcessor SPI 的扩展, 允许注册更多的 bean 定义 常规 BeanFactoryPostProcessor 检测开始之前

所以MapperScannerConfigurer通过sqlSessionFactory实例化数据源对象BeanFacoryPostProcessor(负责&lt;context:property-placeholder/&gt;)没有被利用。 所以我的问题转变为如何从&lt;context:property-placeholder/&gt;BeanDefinitionRegistryPostProcessor(MapperScannerConfigurer) 重新排序BeanFacoryPostProcessor

已解决

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


正如我之前所说的MapperScannerConfigurer 是一个BeanDefinitionRegistryPostProcessor,它在BeanFactoryPostProcessor 之前触发,它负责&lt;context:property-placeholder/&gt;。因此,在创建 MapperScannerConfigurer 期间,对外部属性的引用将不会被解析。在这种情况下,我们必须将数据源的创建推迟到应用 BeanFactoryPostProcessor 之后的时间。我们可以通过多种方式做到这一点:

  • MapperScannerConfigurer 中删除p:sqlSessionFactory-ref="sqlSessionFactory"。在这种情况下,不会在MapperScannerConfigurer 之前创建数据源对象,而是在负责&lt;context:property-placeholder/&gt;BeanFactoryPostProcessor 之后创建。如果 applicationContext 中有多个 sqlSessionFactory,那就麻烦了
  • 在高于 1.0.2 的 mybatis-spring 模块版本中,可以设置sqlSessionFactoryBeanName 而不是sqlSessionFactory。它有助于解决 BeanFactoryPostProcessor 的 PropertyPlaceHolder 问题。这是解决mybatis-spring doc中描述的这个问题的推荐方法

【问题讨论】:

  • 您的 Spring 上下文配置中是否还有其他 PropertyPlaceholderConfigurersee this thread
  • 肯定不行,我是在setLoctions方法中设置断点检查的:只调用一次
  • 我会尝试使用领先的/ 作为属性位置:location="classpath:/props/datasource.properties"
  • 我有同样的问题,我只是删除了 autoWire=“byName”,属性文件就可以工作了。
  • @maks 你开膛手。我遇到了同样的问题,只要我添加了MapperScannerConfigurer,它就会与我的属性占位符搞砸。查看代码时,我发现它实现了BeanDefinitionRegistryPostProcessor,这让我相信它是原因并最终找到了你的问题。回答你自己的问题,伙计!这是必要的确切解决方案:)

标签: spring mybatis


【解决方案1】:

我遇到了同样的问题并遇到了这篇文章,但我无法像 maks 那样解决它。最终对我有用的是将 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 个月了,但我想有人可能会觉得它很有用。

【讨论】:

    【解决方案2】:

    简写形式:加载以下实现的正确方法是:BeanDefinitionRegistryPostProcessor?

    扩展表单: 有没有办法在创建任何 bean 之前加载 BeanDefinitionRegistryPostProcessor。如果你看一下javadoc:

    对标准 {@link BeanFactoryPostProcessor} SPI 的扩展,允许 before 常规 bean 定义的注册 BeanFactoryPostProcessor 检测开始。

    因此,它应该在创建 bean 定义但在创建任何 bean 之前加载。如果我们只是在应用程序 xml 中将它创建为常规 bean,那么它首先就违背了拥有这个 bean 的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2019-08-18
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2013-01-05
      相关资源
      最近更新 更多