MyBatis-Datbase连接失败,因为PropertyPlacholderConfigurer无法解析占位符引用

时间:2019-04-01 00:08:36

标签: spring mybatis

我是MyBatis的新手,并且由于无法解析属性占位符而导致测试类无法连接到数据库时遇到了问题。一旦我用硬编码字符串替换了${placeholder}设置,它就可以正常工作。

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

有人还能帮我发现我做错了什么..而我还剩下一些头发吗?如果您需要更多信息,请询问。

相关版本:

  • springframework 4.3
  • mybatis版本3.5.0
  • mybatis-spring版本1.3.2
  • dbcp 2.6版

这是我的最新尝试(对不起,代码混乱)

myproperties.properties

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

applicationContext.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:无法   获取JDBC连接;嵌套异常是java.sql.SQLException:   无法创建PoolableConnectionFactory(IO错误:Netword适配器   无法建立连接)

1 个答案:

答案 0 :(得分:0)

永远不会失败。在问题上花几个小时,发布问题后就可以找到答案。

找出占位符未解决的原因是因为属性名称被意外复制,位于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

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