spring3.0.6 使用context:property-placeholder载不进属性
我用spring3.0.6+mybatis3.0.6+mybatis-spring1.0.2做了一个demo,我把数据库连接驱动放在src下,但是我在spring配置文件中加上 <context:property-placeholder location="classpath:jdbc.properties" />,dataSource配置如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/> --> <!-- <property name="jdbcUrl" value="jdbc:oracle:thin:@10.1.1.3:1521:orcl"/> --> <!-- <property name="user" value="hyq"/> --> <!-- <property name="password" value="oracle"/> --> <property name="driverClass" value="${jdbc.driverClass}"/> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean>
抛出异常如下:
2011-11-19 20:37:57 WARN [com.mchange.v2.c3p0.DriverManagerDataSource:107] - Could not load driverClass ${jdbc.driverClass} java.lang.ClassNotFoundException: ${jdbc.driverClass}
而把上面那段注释的打开,相当于写死在配置文件中就正常。从上面异常我只能看出没加载
属性文件成功,属性文件如下:
## jdbc config jdbc.driverClass=oracle.jdbc.driver.OracleDriver jdbc.jdbcUrl=jdbc:oracle:thin:@10.1.1.3:1521:orcl jdbc.user=hyq jdbc.password=oracle jdbc.initialPoolSize=5 jdbc.minPoolSize=5 jdbc.maxPoolSize=30 jdbc.acquireIncrement=5 jdbc.maxIdleTime=10 jdbc.maxStatements=0
我是maven搭的,全放在/src/main/resources下,哪位帮我找找原因,谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(23)
你确定${driver} 起作用了?怎么我的不行。
我的只要有org.mybatis.spring.mapper.MapperScannerConfigurer 就会报错,读取不了 dataSource的变量
我也是这个错误,我把关于mybatis的map的配置写到另外一个文件中,然后把新文件的beans的default-autowire="byName"属性干掉,就解决这个问题了,你可以试试。
我得还没有解决呢
这是我的邮箱:mad_programmer@163.com
你好,能否把你这里的配置全部粘一下,或发到我的邮箱,我这里怎么弄也解决不了这个问题,谢谢。
这个方法最NB,我按照这个方式解决了 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
楼上的解决方案比较一般,在3.1.1版本中配置的时候提供了以下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxxx.dal.mapper" />
<property name="sqlSessionFactoryBeanName" value="ysSqlSessionFactory" />
<!-- <property name="sqlSessionFactory" ref="ysSqlSessionFactory"></property> -->
</bean>
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean,所以不会引发提前初始化问题。。
以上供参考!
我这么配置也会出错!~
1.如果配了default-autowire="byName" 就用只能用这种方式。 2.如果没配,上面的也可以解决。
谢谢,通过你的方法解决了问题
感谢,解决
楼上的解决方案比较一般,在3.1.1版本中配置的时候提供了以下:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxxx.dal.mapper" />
<property name="sqlSessionFactoryBeanName" value="ysSqlSessionFactory" />
<!-- <property name="sqlSessionFactory" ref="ysSqlSessionFactory"></property> -->
</bean>
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean,所以不会引发提前初始化问题。。
以上供参考!
谢谢。 问题解决了!
我遇到了同样的问题。如果在spring配置文件中配置了MapperScannerConfigurer,服务器启动时就会报以下错误: Could not load driverClass ${driverClassName} 也没有配置sqlSessionFactory
前提是没配default-autowire="byName"
我现在也遇到了这个问题,LZ你是注释掉什么就没问题的?
我现在也遇到了这个问题,LZ你是注释掉什么就没问题的?
谢谢这位兄弟,我也刚刚找到这个原因了,和你上面原因一样,我注释掉了,就没问题
能否给出具体的配置方法吗?我也遇到相同的问题,根据你的描述,我没弄明白怎么修改。
谢谢,问题解决了
问题原因相同
我也遇到过这个问题,但不清楚是否和你的情况一样,不过导致的原因应该差不多。
==================================================
在spring里使用org.mybatis.spring.mapper.MapperScannerConfigurer 进行自动扫描的时候,设置了sqlSessionFactory 的话,可能会导致PropertyPlaceholderConfigurer失效,也就是用${jdbc.username}这样之类的表达式,将无法获取到properties文件里的内容。 导致这一原因是因为,MapperScannerConigurer实际是在解析加载bean定义阶段的,这个时候要是设置sqlSessionFactory的话,会导致提前初始化一些类,这个时候,PropertyPlaceholderConfigurer还没来得及替换定义中的变量,导致把表达式当作字符串复制了。 但如果不设置sqlSessionFactory 属性的话,就必须要保证sessionFactory在spring中名称一定要是sqlSessionFactory ,否则就无法自动注入。又或者直接定义 MapperFactoryBean ,再或者放弃自动代理接口方式。