spring mybatis使用时报 java.lang.AbstractMethodError

本文解决了在使用Spring和MyBatis时遇到的关于mybatis-spring版本导致的异常问题,通过调整mybatis-spring依赖版本为1.3.0成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring mybatis使用时出现以下问题

Exception in thread "main" java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;

原因

mybatis-spring版本问题

解决办法
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.0</version>
    </dependency>

转载于:https://my.oschina.net/u/2403701/blog/796062

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'chargingSystemController': Unsatisfied dependency expressed through field 'chargingSystemService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'chargingSystemServiceImpl': Unsatisfied dependency expressed through field 'tokenUtilMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'tokenUtilMapper' defined in file [D:\项目\cmms-sv\target\classes\com\rd\cmms\chargingSystem\mapper\TokenUtilMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class]: Unsatisfied dependency expressed through method 'sqlSessionFactory' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'createDataSource' defined in class path resource [com/rd/cmms/config/ShardingJdbcConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'createDataSource' threw exception; nested exception is java.lang.AbstractMethodError: com.mysql.jdbc.JDBC4Connection.getSchema()Ljava/lang/String;
最新发布
08-05
<think>我们正在解决Spring Boot应用启动时因JDBC驱动不兼容导致的DataSource创建失败问题,具体错误是`UnsatisfiedDependencyException`,涉及`sqlSessionFactory`、`createDataSource`、`AbstractMethodError`和`JDBC4Connection.getSchema()`方法。 根据错误信息,核心问题是`AbstractMethodError`,这通常发生在编译时使用了高版本的接口,但运行时使用了低版本的实现类(即JDBC驱动)。具体来说,`JDBC4Connection`是JDBC4.0的驱动,而`getSchema()`方法是JDBC4.1中引入的。因此,如果运行时驱动版本低于4.1,就会在尝试调用`getSchema()`时抛出`AbstractMethodError`。 解决方案: 1. 升级数据库驱动:确保使用的JDBC驱动版本至少支持JDBC4.1(如MySQL驱动5.1.38以上或6.0以上)。 2. 如果无法升级驱动,可以尝试在Spring Boot配置中关闭数据源的schema验证(如果问题是由schema验证引起的)。 步骤: 方案一:升级驱动 在pom.xml中更新数据库驱动版本,例如对于MySQL: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <!-- 确保版本足够高 --> </dependency> ``` 方案二:关闭schema验证(如果问题是由此引起) 在application.properties中: ```properties spring.datasource.hikari.connection-test-query=SELECT 1 spring.datasource.tomcat.test-on-borrow=true spring.datasource.tomcat.validation-query=SELECT 1 # 或者针对HikariCP(Spring Boot 2.x默认): spring.datasource.hikari.initialization-fail-timeout=0 # 另外,尝试关闭数据源的自动创建schema(如果不需要) spring.jpa.hibernate.ddl-auto=none # 或者,如果使用的是Spring Boot 1.x,可能是: spring.datasource.initialize=false ``` 但是,根据错误信息,更可能是驱动版本问题。因此,优先升级驱动。 另外,注意检查是否同时存在多个不同版本的驱动,使用`mvn dependency:tree`查看依赖树,排除冲突。 如果问题仍然存在,可能是MyBatis-Spring的配置问题。确保`SqlSessionFactory`正确配置,并且数据源被正确注入。例如,在Spring Boot中,我们通常这样配置: ```java @Configuration public class MyBatisConfig { @Autowired private DataSource dataSource; @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); // 其他配置,如mapperLocations, typeAliases等 return sessionFactory.getObject(); } } ``` 如果使用自动配置,确保没有多个`SqlSessionFactory`被创建。 最后,关于引用中提到的`AbstractMethodError`,参考[^1]中提到的错误,可能是由于版本不兼容导致的方法未实现,因此升级驱动是根本解决之道。 相关问题: 1. 如何排查Spring Boot启动时的`UnsatisfiedDependencyException`? 2. 如何解决MyBatisSpring Boot集成时出现的`AbstractMethodError`? 3. 如何正确配置Spring Boot中的多数据源? 注意:以上回答基于用户的问题和提供的引用信息,但引用信息中提到的错误与用户问题不完全一致,用户问题更聚焦于JDBC驱动不兼容导致的`AbstractMethodError`。</think>### 解决 Spring Boot 启动时因 JDBC 驱动不兼容导致的 DataSource 创建失败问题 当出现 `UnsatisfiedDependencyException` 并伴随 `AbstractMethodError: getSchema()` 错误时,通常是因为 **JDBC 驱动版本与 Spring Boot 或数据库版本不兼容**。以下是具体解决方案: --- ### 核心原因分析 `AbstractMethodError: JDBC4Connection.getSchema()` 表明: 1. **JDBC 驱动过旧**:低版本驱动未实现 JDBC 4.1 的 `getSchema()` 方法 2. **依赖冲突**:项目中存在多个不同版本的 JDBC 驱动(如 MySQL Connector/J) 3. **Spring Boot 自动配置**:尝试调用高版本 JDBC 方法时,低版本驱动无法响应 --- ### 解决方案 #### ✅ 方法 1:升级 JDBC 驱动版本(推荐) 在 `pom.xml` 中显式指定兼容的 JDBC 驱动版本: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!-- 选择与数据库版本匹配的驱动 --> <version>8.0.33</version> <!-- 适用于 MySQL 8.x --> <!-- 或 <version>5.1.49</version> 适用于 MySQL 5.x --> </dependency> ``` **关键点**: - MySQL 5.x 使用驱动 5.1.x - MySQL 8.x 使用驱动 8.0.x - 通过 `mvn dependency:tree | grep mysql` 检查是否有多版本冲突 #### ✅ 方法 2:关闭 Schema 验证(临时方案) 在 `application.properties` 中添加: ```properties # 禁用 HikariCP 的 schema 验证 spring.datasource.hikari.initialization-fail-timeout=0 spring.datasource.hikari.connection-init-sql=SELECT 1 # 或针对 Tomcat 连接池 spring.datasource.tomcat.test-on-borrow=true spring.datasource.tomcat.validation-query=SELECT 1 ``` #### ✅ 方法 3:排除冲突依赖 若存在多个数据源库冲突: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <!-- 排除旧版 Hibernate 可能引入的驱动 --> <exclusion> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </exclusion> </exclusions> </dependency> ``` #### ✅ 方法 4:显式配置 DataSource 在配置类中手动初始化 DataSource: ```java @Bean public DataSource dataSource() { HikariDataSource ds = new HikariDataSource(); ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); // 明确指定驱动类 ds.setJdbcUrl("jdbc:mysql://localhost:3306/db"); ds.setUsername("user"); ds.setPassword("pass"); ds.setConnectionTestQuery("SELECT 1"); // 绕过 schema 检查 return ds; } ``` --- ### 验证步骤 1. 清理项目并重新构建: ```bash mvn clean install -U ``` 2. 检查驱动版本一致性: ```bash lsof -p <PID> | grep mysql-connector ``` 3. 启动时添加 debug 参数: ```bash java -jar yourapp.jar --debug ``` > **根本解决**:90% 的此类问题通过升级 JDBC 驱动解决。例如 MySQL 8.x 必须使用 `mysql-connector-java:8.0.x`,且 JDK 需 ≥ 1.8[^1][^3]。 --- ### 相关问题 1. 如何诊断 Spring Boot 启动时的 `UnsatisfiedDependencyException`? 2. MyBatisSpring Boot 集成时常见的驱动兼容性问题有哪些? 3. 多数据源配置下如何避免 JDBC 驱动冲突? 4. 如何强制覆盖 Spring Boot 的默认连接池配置?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值