spring+mybatis整合时占位符无法读取jdbc.properties的问题

来源:互联网 发布:网络嗅探器 安卓 编辑:程序博客网 时间:2024/05/22 06:40
这段时间在使用spring+mybatis整合时遇到了一个问题,我想引用外部jdbc.properties,然后在配置文件中使用占位符,如下:
 <!--引入属性文件 -->    <context:property-placeholder location="classpath:jdbc.properties"/>        <!--数据库连接-->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass"><value>${jdbc.driverClassName}</value></property><property name="jdbcUrl"><value>${jdbc.url}</value></property><property name="user"><value>${jdbc.username}</value></property><property name="password"><value>${jdbc.password}</value></property>    </bean>
但是我发现出现了以下异常:
 WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] - Could not load driverClass ${jdbc.driverClassName}java.lang.ClassNotFoundException: ${jdbc.driverClassName}at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)at java.lang.Class.forName0(Native Method)at java.lang.Class.forName(Class.java:190)at com.mchange.v2.c3p0.DriverManagerDataSource.ensureDriverLoaded(DriverManagerDataSource.java:100)at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:132)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182)at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137)at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014)at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810)at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)

这个问题是无法识别占位符,就是在加载过程中直接把$(jdbc.driverClassName)当做字符串处理了。后来在网上找过问题的解决方式,是说因为配置了

<!-- 扫描接口所在的包  -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">         <property name="basePackage" value="com.xx.dao"/>        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>    </bean>
MapperScannerConfigurer 先于properties文件处理,意思是没进行占位符的变量赋值就被使用了。去掉sqlSessionFactory这个属性

<!-- 扫描接口所在的包  -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">         <property name="basePackage" value="com.xx.dao"/>    </bean>
同时记得加上这样的bean,id一定是这样,因为要使用的时候会去找这个bean

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">          <property name="dataSource" ref="dataSource"/>    <property name="configLocation" value="classpath:config.xml" />    <property name="mapperLocations">    <value>classpath:dao/mapper/*Mapper.xml</value>    </property>    </bean>
ps:同时注意beans 可能会配置有这个 default-autowire="byName" ,去掉即可。

0 0