背景
今天在整理之前写的代码时,检查pom文件发现,项目中同时存在mybatis-spring-boot-starter和mybatis-plus-boot-starter两个依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
问题出现
我记得这两个依赖是相互独立的,检查它们的POM文件,发现确实很多依赖如mybatis-spring、spring-boot-starter-jdbc等是重复的。考虑到代码中都是按MyBatis Plus写的,于是决定删除mybatis-spring-boot-starter依赖。
结果出现了标题所述的报错:
问题排查
首先,我怀疑代码中可能有使用mybatis-spring-boot-starter功能的地方,但编译器并未报错,所以排除了这个可能性。
找不到原因,我求助于GPT,它的回答是:
为什么去除
mybatis-spring-boot-starter后出现Invalid value type for attribute 'factoryBeanObjectType': java.lang.String报错?出现这种错误通常是因为 MyBatis Plus 在某些配置上依赖于 MyBatis 的基础配置,而这些配置在
mybatis-spring-boot-starter中已经默认包含。去除mybatis-spring-boot-starter后,如果没有正确配置 MyBatis Plus 的相关属性,就可能导致某些 Bean 的配置错误,从而引发类似的异常。
我恍然大悟,发现确实如它所说,配置文件中确实没有 MyBatis Plus 所需的配置项,于是便添加了一些基本配置:
mybatis-plus:
#实体类扫描
type-aliases-package: com.daniu.pms.domain.entity
configuration:
#开启sql日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
信心满满的启动,却依然出现相同的报错。
发现GPT靠不住,于是我又去网上搜寻信息,发现大多类似问题都是MyBatis Plus版本导致的,于是我便把mybatis-plus-boot-starter换为最新版的3.6.5,但依然报错。
解决问题
无奈之下,只好去MyBatis Plus的官方文档看看有没有办法,结果发现:
原来Spring Boot 2和Spring Boot 3的依赖不同,尽管版本号相同😂。于是将依赖更换为:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.6</version>
</dependency>
问题得以解决。
下面还有MyBatis Plus官方的注意事项:
引入
MyBatis-Plus之后请不要再次引入MyBatis以及mybatis-spring-boot-starter和MyBatis-Spring,以避免因版本差异导致的问题。
或许最开始同时引入mybatis-spring-boot-starter和mybatis-plus-boot-starter却正常运行,才是最不正常的吧。
总结
升级为spring boot3后,MyBatis Plus的依赖要更换为mybatis-plus-spring-boot3-starter。
但因为引入mybatis-spring-boot-starter 3.0.3版本和mybatis-plus-boot-starter 3.5.5版本(其他版本未测试)却刚好正常运行,造成了迷惑,误以为mybatis-plus-boot-starter没有问题。
使用框架时一定要多查阅官方文档,尤其是使用新版本时,否则很容易在这种小问题上浪费时间。