- 浏览: 38130 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
天地炫舞:
厉害啊,居然解决了,等会我也来做下笔记,谢谢
mybatis xml配置文件读取不了 properties的属性 -
YaLove:
你好,“建一个freestyle的Job,然后scm等配置也照 ...
Jenkins加Shell实现最简单的持续部署
问题描述:
今天关注项目中的各配置文件参数设置是否恰当,然后就发现数据源是直接把各参数配置在spring-dao.xml文件当中,同时项目中其它模块又用到了properties配置文件引入属性值的做法,于是就想把数据源配置的参数也迁移到properties配置文件中来,便于以后的修改。
由于使用的是springmvc框架(spring3.1.1+mybatis3.1.1+mybatis-spring-1.1.1),所以就在applicationContent.xml中配置PropertyPlaceholderConfigurer来加载properties配置文件,谁想这种以前在项目中应用很好使的方式今天怎么也通不过,配置完成,重新部署后就报如下错误:
2016-03-17 10:12:12,217 INFO (com.zsj.authcenter.controller.AuthController:106) - ---authcenter is fail---
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
### The error may exist in com/zsj/authcenter/dao/conf/unite_user.xml
### The error may involve com.zsj.authcenter.dao.mysql.UniteUserDao.findUniteUser
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at com.sun.proxy.$Proxy9.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at com.sun.proxy.$Proxy10.findUniteUser(Unknown Source)
at com.zsj.authcenter.service.impl.AuthServiceImpl.login(AuthServiceImpl.java:36)
at com.zsj.authcenter.controller.AuthController.doLogin(AuthController.java:155)
一开始怀疑是spring版本问题,就搜索了一下“spring3 PropertyPlaceholderConfigurer”,结果发现还真有类似的提问,只不过比我问的更准确,一下就把问题定位到了问题的根源-------mybatis下的MapperScannerConfigurer扫描模式造成了bean的加载顺序改变从而使得PropertyPlaceholderConfigurer无法正常加载。
具体说来就是,myabatis使用MapperScannerConfigurer扫描模式后他会优先于PropertyPlaceholderConfigurer执行,所以这个时候,${cpool.checkoutTimeout}还没有被properties文件里面的值所替换,所以出现TypeMismatchException,然后就异常了
知道了异常原因所在,那么问题解决结会快一些了,于是按照相关搜索,查阅下面的帖子,基本找到解决方案:
具体spring-dao.xml配置文件如下 :
<!--只要下面bean的id不叫sqlSessionFactory,就成-->
<bean id="ysqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:com/zsj/authcenter/dao/conf/mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zsj.authcenter.dao.mysql" />
<!--核心就是添加下面一句。后面那个属性是value,不是ref,切记-->
<property name="sqlSessionFactoryBeanName" value="ysqlSessionFactory"/>
</bean>
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean,所以不会引发提前初始化问题。。
修改好了之后,满心欢喜的以为解决了问题,于是就部署,启动,结果又报如下错误:
2016-03-17 10:12:12,217 INFO (com.zsj.authcenter.controller.AuthController:106) - ---authcenter is fail---
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
### The error may exist in com/zsj/authcenter/dao/conf/unite_user.xml
### The error may involve com.zsj.authcenter.dao.mysql.UniteUserDao.findUniteUser
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at com.sun.proxy.$Proxy9.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at com.sun.proxy.$Proxy10.findUniteUser(Unknown Source)
at com.zsj.authcenter.service.impl.AuthServiceImpl.login(AuthServiceImpl.java:36)
at com.zsj.authcenter.controller.AuthController.doLogin(AuthController.java:155)
问题是一样的,问题似乎没有解决。可大部分资料都是这样说的啊,难道是我漏掉了什么吗?
经过仔细排查,果真有漏掉的地方,如下:
在spring-dao配置文件里面的解析标签是:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byType">
注意红色部分。
解决方案,将解析标签的红色部分干掉就行了。
有的文件写的是default-autowire="byName",同理,干掉就可以了。
至此,在启动部署,成功解决问题.大功告成.
今天关注项目中的各配置文件参数设置是否恰当,然后就发现数据源是直接把各参数配置在spring-dao.xml文件当中,同时项目中其它模块又用到了properties配置文件引入属性值的做法,于是就想把数据源配置的参数也迁移到properties配置文件中来,便于以后的修改。
由于使用的是springmvc框架(spring3.1.1+mybatis3.1.1+mybatis-spring-1.1.1),所以就在applicationContent.xml中配置PropertyPlaceholderConfigurer来加载properties配置文件,谁想这种以前在项目中应用很好使的方式今天怎么也通不过,配置完成,重新部署后就报如下错误:
2016-03-17 10:12:12,217 INFO (com.zsj.authcenter.controller.AuthController:106) - ---authcenter is fail---
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
### The error may exist in com/zsj/authcenter/dao/conf/unite_user.xml
### The error may involve com.zsj.authcenter.dao.mysql.UniteUserDao.findUniteUser
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at com.sun.proxy.$Proxy9.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at com.sun.proxy.$Proxy10.findUniteUser(Unknown Source)
at com.zsj.authcenter.service.impl.AuthServiceImpl.login(AuthServiceImpl.java:36)
at com.zsj.authcenter.controller.AuthController.doLogin(AuthController.java:155)
一开始怀疑是spring版本问题,就搜索了一下“spring3 PropertyPlaceholderConfigurer”,结果发现还真有类似的提问,只不过比我问的更准确,一下就把问题定位到了问题的根源-------mybatis下的MapperScannerConfigurer扫描模式造成了bean的加载顺序改变从而使得PropertyPlaceholderConfigurer无法正常加载。
具体说来就是,myabatis使用MapperScannerConfigurer扫描模式后他会优先于PropertyPlaceholderConfigurer执行,所以这个时候,${cpool.checkoutTimeout}还没有被properties文件里面的值所替换,所以出现TypeMismatchException,然后就异常了
知道了异常原因所在,那么问题解决结会快一些了,于是按照相关搜索,查阅下面的帖子,基本找到解决方案:
具体spring-dao.xml配置文件如下 :
<!--只要下面bean的id不叫sqlSessionFactory,就成-->
<bean id="ysqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:com/zsj/authcenter/dao/conf/mybatis-config.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zsj.authcenter.dao.mysql" />
<!--核心就是添加下面一句。后面那个属性是value,不是ref,切记-->
<property name="sqlSessionFactoryBeanName" value="ysqlSessionFactory"/>
</bean>
改用sqlSessionFactoryBeanName注入就没有问题(不要使用sqlSessionFactory属性注入,使用sqlSessionFactoryBeanName注入),因为这时不会立即初始化sqlSessionFactory,传入的只是名字,非bean,所以不会引发提前初始化问题。。
修改好了之后,满心欢喜的以为解决了问题,于是就部署,启动,结果又报如下错误:
2016-03-17 10:12:12,217 INFO (com.zsj.authcenter.controller.AuthController:106) - ---authcenter is fail---
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
### The error may exist in com/zsj/authcenter/dao/conf/unite_user.xml
### The error may involve com.zsj.authcenter.dao.mysql.UniteUserDao.findUniteUser
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class '${jdbc.driverClassName}'
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
at com.sun.proxy.$Proxy9.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:95)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)
at com.sun.proxy.$Proxy10.findUniteUser(Unknown Source)
at com.zsj.authcenter.service.impl.AuthServiceImpl.login(AuthServiceImpl.java:36)
at com.zsj.authcenter.controller.AuthController.doLogin(AuthController.java:155)
问题是一样的,问题似乎没有解决。可大部分资料都是这样说的啊,难道是我漏掉了什么吗?
经过仔细排查,果真有漏掉的地方,如下:
在spring-dao配置文件里面的解析标签是:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
default-autowire="byType">
注意红色部分。
解决方案,将解析标签的红色部分干掉就行了。
有的文件写的是default-autowire="byName",同理,干掉就可以了。
至此,在启动部署,成功解决问题.大功告成.
发表评论
-
linux 安装es 7.6.2 集群
2021-01-20 10:42 01、我的3台linux机器是 我的创建的三台分 ... -
记一次mysql主从同步延迟解决方案
2020-08-27 16:01 01、背景:近期项目在一个查询模块,返回的数据时而有,时 ... -
记我的第一次spring aop项目实践
2020-04-17 16:46 437一、需求背景。 1 ... -
myeclipse 的properties文件显示不了中文的问题
2016-03-23 14:25 391操作步骤: Window-》Ppreference-》Gen ... -
spring AspectJ的Execution表达式
2015-12-03 09:43 675原址参考: http://blog.csdn. ... -
spring mvc 原理及应用
2015-11-09 13:37 661原址:http://blog.csdn.net/ ... -
Jenkins加Shell实现最简单的持续部署
2015-11-07 10:30 7923参考跳转链接: http://ju.outofmemor ... -
maven私服仓库搭建
2015-10-15 10:54 622参考:http://www.blogjava.net/ ... -
jms 应用示例教程
2015-10-13 15:50 393http://blog.csdn.net/quincylk/a ... -
Java JMS学习纪要
2015-10-13 15:36 512http://www.51testing.com/html/ ... -
java 打包可执行文件
2013-02-03 00:10 764java类文件存放路径 F:\BatchLoad.java ... -
JAVA面向对象概念之抽象与接口的意思以及区别
2012-02-22 23:04 830抽象类不可以被实例化 ... -
list 和数组相互转换
2011-10-09 09:09 843//数组转List List data = new Ar ... -
java监控服务器端应用程序
2011-09-16 17:55 1442最近测程序性能,需要远程监控服务端程序的运行情况,从网上找了很 ...
相关推荐
2. 根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件 3. 读取作为方法参数传递的属性 因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件...
2. **`<properties>`**:用于加载外部属性文件,例如数据库连接信息。这些属性可以在配置文件的其他地方引用,提供了一种灵活的方式来管理敏感信息。 3. **`<settings>`**:这个标签用于配置MyBatis的全局行为,...
MyBatis Generator是MyBatis框架的一个插件,它通过读取数据库元数据,根据预设的模板生成相应的Java模型类、Mapper接口和XML映射文件。在"mybatis自动生成语句XML版本"这个项目中,我们主要关注的是如何配置和使用...
通过此DTD,我们可以清楚地了解每个配置元素的结构和用途,比如`properties`用于读取配置文件或属性文件中的参数,`settings`用于设置MyBatis的全局行为,`mappers`则用于定义映射文件的位置。 例如,以下是一个...
其中,`value`属性引用了从属性文件中读取的值,例如数据库驱动名、URL等。 **5. SqlSessionFactory配置** ```xml <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"> ``` 这里定义了一个...
当我们在 MyBatis 配置文件中使用 jdbc.properties 文件时,可能会遇到设置不起作用的问题。这是因为 MyBatis 无法正确地读取 jdbc.properties 文件中的信息。 解决方法 ------------ 解决这个问题的方法很简单。...
首先,我们需要在项目的资源目录下创建generatorConfig.xml文件,这是Mybatis Generator的主要配置文件。在这个文件中,我们需要配置数据库连接信息(包括driverClass、jdbcUrl、userId、password等),以及要生成的...
MyBatis Generator(MBG)是一款强大的自动化代码生成工具,专为MyBatis框架设计,能够自动生成DAO层、实体Bean以及Mapper XML文件,极大地提高了开发效率。在使用MBG时,用户只需要进行简单的配置,就可以自动生成...
例如,DTD定义了`configuration`元素,它是配置文件的根元素,包含了`properties`(用于加载外部属性文件)、`settings`(系统设置)、`typeAliases`(类型别名)、`objectFactory`(对象工厂)、`plugins`(插件)...
在SqlMapConfig.xml中,properties元素用于加载外部属性文件,例如db.properties。这种方式可以将数据库连接参数单独配置在外部文件中,而不需要在SqlMapConfig.xml中硬编码。这使得参数的管理更加方便和灵活。 在...
下面详细说明Mybatis-generator的配置文件generatorConfig.xml中的各个标签以及其作用。 generatorConfiguration:这是Mybatis-generator的根标签,定义了整个生成器的配置。所有的配置信息都是在该标签内定义。 ...
首先,`mybatis-config.xml`是MyBatis的核心配置文件,它定义了SqlSessionFactory的创建方式,数据源、事务管理器等关键设置。在这个文件中,我们可以添加插件配置来实现MyBatis与Redis的交互,比如使用一个拦截器来...
这将根据配置文件中的设定,从数据库中读取表信息,自动生成对应的实体类、Mapper接口和Mapper XML文件,放置在指定的目录下。 四、注意事项 1. 确保数据库连接信息正确。 2. 根据实际项目需求,调整MBG配置文件中...
`properties`元素允许开发者加载外部属性文件,如`db.properties`,并提供了覆盖机制。属性按顺序读取:首先读取内部定义的属性,然后是`resource`或`url`加载的属性,最后是参数传递的属性。 **3. 全局参数设置** ...
2. Configuration.xml 里面 的<mapper resource="com/yihaomen/mybatis/model/User.xml"/>是包含要映射的类的xml配置文件。 3. 在User.xml 文件里面 主要是定义各种SQL 语句,以及这些语句的参数,以及要返回的类型...
综上所述,《Mybatis3系列课程-db.properties》的学习将涵盖Java中的属性文件处理、数据库连接配置、Mybatis框架的基本使用以及相关的数据库操作技巧。通过这门课程,开发者将能够熟练地运用Mybatis3进行数据库操作...
MBG基于配置文件,能够读取数据库中的表信息,然后根据这些信息自动生成对应的Java类和XML映射文件。这些生成的文件通常包括: 1. Java实体类(Entity Class):代表数据库中的表记录,包含表字段对应的属性和...