一、问题背景(真实踩坑场景)
最近在项目中将 Spring Boot 从 2.x 升级到 3.x,数据库层使用的是 MyBatis-Plus。
升级完成后,代码编译正常,但在 启动项目或运行单元测试时直接启动失败。
控制台抛出一个看起来非常'抽象'的异常:
本文针对 Spring Boot 3.x 升级后 MyBatis-Plus 启动报错 Invalid value type for attribute factoryBeanObjectType 的问题进行分析。根本原因是 Spring Framework 6.x 对 FactoryBean 类型校验变严,不再允许 String 类型,而旧版 mybatis-spring 仍传递字符串。解决方案是将 mybatis-spring 升级至 3.0.3 版本并排除旧依赖,确保 ORM 框架与 Spring Boot 大版本兼容。
最近在项目中将 Spring Boot 从 2.x 升级到 3.x,数据库层使用的是 MyBatis-Plus。
升级完成后,代码编译正常,但在 启动项目或运行单元测试时直接启动失败。
控制台抛出一个看起来非常'抽象'的异常:
java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
乍一看不像配置问题,也不像代码写错,但就是启动不了,非常影响开发效率。

实际项目中一般表现为 Spring Boot 启动到一半直接中断
*************************** APPLICATION FAILED TO START ***************************
紧接着就是核心异常:
Invalid value type for attribute 'factoryBeanObjectType'
如果你在项目中写了 Mapper 层或 Service 层测试:
@SpringBootTest class UserMapperTest { ... }
运行测试时,也会在加载 Spring 上下文阶段直接失败。
排查这个问题时,一定要把堆栈完整打出来,关键在这里:
Caused by: java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getTypeForFactoryBeanFromAttributes(FactoryBeanRegistrySupport.java:82) at org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(AbstractBeanFactory.java:1718) at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:1648)
Spring Boot 3.x 底层升级到 Spring Framework 6.x 后,对 FactoryBean 做了更严格的类型校验:
factoryBeanObjectType 是字符串ClassResolvableType旧版本的 mybatis-spring 或 mybatis-plus-starter 在注册 Mapper Bean 时:
factoryBeanObjectType = "com.xxx.UserMapper";
这是一个 String 类型,在 Spring Boot 2.x 没问题,
但在 Spring Boot 3.x 会直接抛 IllegalArgumentException。
参考 mybatis-spring-issues 855 得知:

📌 一句话总结根因:
Spring Boot 3 规则升级了,但 MyBatis 生态没同步升级
你可以对照看看是不是下面的情况:
👉 满足 2 条以上,基本就是这个问题。
这是最稳妥、最推荐的解决方式。
<!-- MyBatis-Plus Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
<exclusions>
<!-- 排除旧版本 mybatis-spring -->
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入 Spring Boot 3 兼容版本 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
📌 重点说明
mybatis-spring 3.0.x 是官方适配 Spring Boot 3 的版本如果是企业项目或多模块工程,建议用 dependencyManagement:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>
</dependencyManagement>
这样可以避免不同模块依赖冲突。
虽然不是根因,但也建议顺手检查:
@MapperScan("com.xxx.project.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Started Application in 3.1 seconds
Tests run: 5, Failures: 0, Errors: 0
到这里,说明问题彻底解决。
这个错误:
✅ 本质是 Spring Boot 3 与旧版 MyBatis 生态不兼容
Spring Boot 大版本升级,ORM 框架一定要同步升级

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online