首页 > 解决方案 > MyBatis - 数据库连接失败,因为 PropertyPlacholderConfigurer 不解析占位符引用

问题描述

我是 MyBatis 的新手,我遇到了一个测试类无法连接到数据库的问题,因为属性占位符没有得到解决。只要我用${placeholder}硬编码字符串替换设置,它就可以正常工作。

我已经搜索了很多,发现像这样的线程context:property-placeholder doesn't resolve references。不幸的是,将sqlSessionFactoryBeanName属性添加到MapperScannerConfigurer没有效果。无论我尝试了什么,测试类仅在我对连接设置进行硬编码时才有效。

谁能帮我找出我做错了什么......虽然我还有一些头发?如果您需要更多信息,请询问。

相关版本:

这是我的最新尝试(抱歉代码混乱)

myproperties.properties

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword

应用程序上下文.xml

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlacholderConfigurer">
  <property name="locations">
    <list>
      <value>classpath:myproperties.properties</value>
    </list>
  </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${driverClassName}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="typeAliasesPackage" value="com.abc.model"/>
  <property name="mapperLocations" value="classpath*:MyMapper.xml"/>
</bean>

<bean id="transactionManager"
   class="org.springframeword.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource" />
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
    p:basePackage="com.abc.mappers"
    p:sqlSessionFactoryBeanName="sqlSessionFactory"
    p:processPropertyPlaceholders="true" />

mybatis-config.xml

<configuration>
   <typeAliases>
      <typeAlias ..../>
   </typeAliases>

   <environments default="dev">
      <environment id="dev">
         <transactionManager type="JDBC"/>  
         <dataSource type="POOLED">
             <property name="driver" value="${driverClassName}"/>
             <property name="url" value="${url}"/>
             <property name="username" value="${username}"/>
             <property name="password" value="${password}"/>
          </dataSource>        
      </environment>
   </environments>

   <mappers>
      <mapper resource="/path/to/MyMapper.xml"/>
   </mappers>

</configuration>

测试类无法连接,出现这样的错误

###查询数据库时出错。原因 org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; 嵌套异常是 java.sql.SQLException: Cannot create PoolableConnectionFactory (IO Error: The Netword Adapter 无法建立连接)

标签: springmybatis

解决方案


从未失败。花几个小时在一个问题上,你一发布问题就会找到答案。

原来占位符未解析的原因是属性名称意外重复,位于底部myproperties.properties

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword
...
...
#duplicated property names
driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin@//host:port/someservicename
username=someusername
password=somepassword

一旦我删除了重复项,占位符就解决了。希望这个愚蠢的错误会帮助别人。


推荐阅读