Bug记录:Spring Boot 3.x 与 MyBatis-Plus 版本兼容性问题排查与解决(Invalid value type for attribute ‘factoryBeanObje)

项目场景:

公司旧项目重构,将旧项目从旧框架迁移到新框架中。
升级信息:
JDK: 8 -> 17
Spring Boot:2.5.7 -> 3.2.9
Mybatis-Plus:3.4.0 -> 3.5.8


问题描述

Spring Boot 3.x 版本集成 MyBatis-Plus 时启动报错,异常信息如下:

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'logMapper' defined in file Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:857) ~[spring-beans-6.1.12.jar:6.1.12]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:743) ~[spring-beans-6.1.12.jar:6.1.12]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:735) ~[spring-beans-6.1.12.jar:6.1.12]
	at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.1.12.jar:6.1.12]
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.1.12.jar:6.1.12]
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:789) ~[spring-context-6.1.12.jar:6.1.12]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:607) ~[spring-context-6.1.12.jar:6.1.12]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) ~[spring-boot-3.2.9.jar:3.2.9]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) ~[spring-boot-3.2.9.jar:3.2.9]
	at com.deepit.system.SystemServiceApplication.main(SystemServiceApplication.java:29) ~[classes/:na]

这类错误通常是由于 Spring Boot 3.x 与 MyBatis-Plus 版本不兼容导致的。Spring Boot 3.x 对底层依赖进行了重大升级,特别是对 Jakarta EE API 的采用,使得许多旧版本的库不再兼容。


原因分析:

Spring Boot 3.x 与 MyBatis-Plus 的不兼容主要源于以下两点:

  • mybatis-spring 版本不匹配:传统的 mybatis-plus-boot-starter 依赖中包含的mybatis-spring 版本与 Spring Boot 3.x 不兼容
  • Servlet API 变更:Spring Boot 3.x 使用了 Jakarta Servlet API(包路径从 javax 改为 jakarta),而旧版 MyBatis-Plus 仍使用旧的 javax 包

根据官方文档和社区实践,Spring Boot 与 MyBatis-Plus 的版本对应关系如下:
详见官网

Spring Boot 版本推荐的 Starter
Spring Boot2mybatis-plus-boot-starter
Spring Boot3mybatis-plus-spring-boot3-starter
Spring Boot4 (自3.5.13开始)mybatis-plus-spring-boot4-starter
Springmybatis-plus

解决方案:

对于 Spring Boot 3.x 项目,应使用官方推荐的的 mybatis-plus-spring-boot3-starter

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值