springboot+mybatisplus项目中扫描不到@mapper注解的解决方法

之前使用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 类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值