之前使用spring boot 3.4.4加mybatisplus一直现在扫描不到mapper接口,该有的注解都有,显示我的mapper接口类型为String类型不是Class类型,最后发现问题为包不兼容.
//这个是我一开始报错用的包,虽然maven官网说支持spring boot 3,但是其实用不了
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.8</version>
</dependency>
//这个是正常能用的
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.8</version>
</dependency>
具体原因为:
问题的核心在于 MyBatis-Plus 的两个 Starter 在 Spring Boot 3.4.4 环境下的兼容性差异。
1. mybatis-plus-boot-starter:3.5.8
- 设计背景:
- mybatis-plus-boot-starter 是 MyBatis-Plus 的传统 Starter,最初为 Spring Boot 2.x 设计,后来逐步适配 Spring Boot 3.x。
- 在 3.5.8 版本中,虽然官方宣称支持 Spring Boot 3.x,但它的默认依赖和自动配置逻辑可能未完全适配 Spring Boot 3.4.4 的新特性。
- 依赖问题:
- 根据 Maven 仓库信息,mybatis-plus-boot-starter:3.5.8 默认依赖 spring-boot-starter:2.7.18(Spring Boot 2.x 系列)。
- Spring Boot 2.x 使用的是 javax.* 命名空间,而 Spring Boot 3.4.4 使用的是 jakarta.* 命名空间(Jakarta EE 9+)。
- 如果你的项目直接声明了 Spring Boot 3.4.4 作为父依赖(通过 <parent> 或 spring-boot-dependencies),Maven 会强制将 spring-boot-starter 升级到 3.4.4,但 mybatis-plus-boot-starter 内部的自动配置类可能未完全适配这种升级。
- 错误根源:
- 在 Spring Boot 3.4.4 中,Spring Framework 6.x 对 Bean 定义的处理更加严格,要求 factoryBeanObjectType 必须是 Class 类型(例如 EdocCategoryMapper.class)。
- mybatis-plus-boot-starter:3.5.8 的 MybatisPlusAutoConfiguration 或 MapperScannerConfigurer 在扫描 Mapper 接口时,可能仍然沿用了旧逻辑,将接口类型作为字符串(例如 "com.bdqn.mapper.EdocCategoryMapper")传递给 Spring 的 Bean 工厂。
- 这导致 Spring 在解析 factoryBeanObjectType 时抛出类型错误:Invalid value type for attribute 'factoryBeanObjectType': java.lang.String。
2. mybatis-plus-spring-boot3-starter:3.5.8
- 设计背景:
- mybatis-plus-spring-boot3-starter 是 MyBatis-Plus 专门为 Spring Boot 3.x 推出的 Starter,明确针对 Spring Framework 6.x 和 Jakarta EE 9+ 优化。
- 依赖适配:
- 它直接依赖 spring-boot-starter:3.4.4(与你的项目版本一致),确保所有依赖和自动配置与 Spring Boot 3.x 的生态完全对齐。
- 修复问题:
- 这个 Starter 的自动配置类(例如 MybatisPlusAutoConfiguration)经过调整,确保在扫描 Mapper 接口时,factoryBeanObjectType 被正确设置为 Class 类型,而不是字符串。
- 它适配了 Spring Boot 3.x 的新特性,避免了类型解析错误。
3. 技术细节对比
- Spring Boot 3.4.4 的要求:
- 使用 Jakarta EE 9+(jakarta.* 命名空间)。
- Bean 工厂对 factoryBeanObjectType 的类型检查更严格,必须是 Class 而不是 String。
- mybatis-plus-boot-starter:3.5.8 的不足:
- 即使版本号为 3.5.8,官方文档提到支持 Spring Boot 3.x,但实际测试表明,它在某些场景下(例如你的项目)未完全适配。
- 可能是因为其内部逻辑未更新,或者默认依赖未强制要求 Spring Boot 3.x,导致与 3.4.4 的 Bean 工厂行为不兼容。
- mybatis-plus-spring-boot3-starter:3.5.8 的优势:
- 专为 Spring Boot 3.x 设计,解决了旧版 Starter 的兼容性问题,确保 Mapper 接口扫描正确。
为什么第一个用不了,第二个能用?
- mybatis-plus-boot-starter:3.5.8 用不了:
- 它的自动配置逻辑未完全适配 Spring Boot 3.4.4 的新要求,在扫描 edocCategoryMapper 时,错误地将接口类型设置为字符串,导致 Spring Bean 工厂抛出异常。
- 即使你的项目强制使用 Spring Boot 3.4.4,旧版 Starter 的代码可能仍基于 Spring Boot 2.x 的假设运行。
- mybatis-plus-spring-boot3-starter:3.5.8 能用:
- 它是为 Spring Boot 3.x 专门开发的,自动配置逻辑与 Spring Framework 6.x 和 Jakarta EE 9+ 完全兼容,确保 factoryBeanObjectType 被正确设置为 Class 类型。