跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 3.x 启动报错 factoryBeanObjectType 解决方案

对 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 大版本兼容。

监控大屏发布于 2026/3/29更新于 2026/10/24134 浏览

一、问题背景(真实踩坑场景)

最近在项目中将 Spring Boot 从 2.x 升级到 3.x,数据库层使用的是 MyBatis-Plus。
升级完成后,代码编译正常,但在 启动项目或运行单元测试时直接启动失败。

控制台抛出一个看起来非常'抽象'的异常:

java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String 

乍一看不像配置问题,也不像代码写错,但就是启动不了,非常影响开发效率。


二、错误现象(启动直接失败)

1️⃣ 启动时报错截图

文章配图

实际项目中一般表现为 Spring Boot 启动到一半直接中断

*************************** APPLICATION FAILED TO START *************************** 

紧接着就是核心异常:

Invalid value type for attribute 'factoryBeanObjectType' 

2️⃣ 单元测试同样失败

如果你在项目中写了 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 在解析 FactoryBean 类型
  • 类型不合法:String

四、问题本质:不是你代码的问题,而是「版本不兼容」

1️⃣ Spring Boot 3.x 变'严格'了

Spring Boot 3.x 底层升级到 Spring Framework 6.x 后,对 FactoryBean 做了更严格的类型校验:

  • ❌ 不再允许 factoryBeanObjectType 是字符串
  • ✅ 必须是:
    • Class
    • 或 ResolvableType

2️⃣ MyBatis / MyBatis-Plus 旧版本还在用老实现

旧版本的 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 生态没同步升级


五、哪些情况下必踩这个坑?

你可以对照看看是不是下面的情况:

  • ✅ Spring Boot 升级到了 3.x
  • ✅ 项目中使用了 MyBatis 或 MyBatis-Plus
  • ✅ 没有刻意升级 mybatis-spring 版本
  • ✅ 启动 / 测试时报 FactoryBean 相关异常

👉 满足 2 条以上,基本就是这个问题。


六、实战解决方案(亲测有效)

⭐ 方案一:升级 MyBatis-Plus + 显式指定 mybatis-spring(推荐)

这是最稳妥、最推荐的解决方式。

Maven 配置示例
<!-- 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 的版本
  • 不显式指定,很容易被 Starter 间接引入旧版本

⭐ 方案二:统一依赖版本(多模块项目推荐)

如果是企业项目或多模块工程,建议用 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);
    }
}
  • ✅ Mapper 包路径是否正确
  • ✅ 没有重复扫描
  • ✅ Mapper 接口不要用原始泛型

八、修复后验证(成功标志)

✅ 项目启动成功
Started Application in 3.1 seconds 
✅ 单元测试正常执行
Tests run: 5, Failures: 0, Errors: 0 

到这里,说明问题彻底解决。


九、总结(踩坑经验)

❗ 很多人第一反应是改配置、改代码,其实方向就错了

这个错误:

  • ❌ 不是 Mapper 写错
  • ❌ 不是配置文件问题
  • ❌ 不是 Spring Boot Bug

✅ 本质是 Spring Boot 3 与旧版 MyBatis 生态不兼容

✅ 记住这条经验

Spring Boot 大版本升级,ORM 框架一定要同步升级

目录

  1. 一、问题背景(真实踩坑场景)
  2. 二、错误现象(启动直接失败)
  3. 1️⃣ 启动时报错截图
  4. 2️⃣ 单元测试同样失败
  5. 三、完整错误堆栈(重点)
  6. 🔍 关键信息提取
  7. 四、问题本质:不是你代码的问题,而是「版本不兼容」
  8. 1️⃣ Spring Boot 3.x 变“严格”了
  9. 2️⃣ MyBatis / MyBatis-Plus 旧版本还在用老实现
  10. 五、哪些情况下必踩这个坑?
  11. 六、实战解决方案(亲测有效)
  12. ⭐ 方案一:升级 MyBatis-Plus + 显式指定 mybatis-spring(推荐)
  13. Maven 配置示例
  14. ⭐ 方案二:统一依赖版本(多模块项目推荐)
  15. 七、辅助排查项(避免误判)
  16. 八、修复后验证(成功标志)
  17. ✅ 项目启动成功
  18. ✅ 单元测试正常执行
  19. 九、总结(踩坑经验)
  20. ❗ 很多人第一反应是改配置、改代码,其实方向就错了
  21. ✅ 记住这条经验

更多推荐文章

查看全部
  • AIGC 时代下 R 语言在数据科学中的应用实践
  • Python 基础语法入门:常量、变量与运算符
  • 基于 Coze 实现小红书爆款视频抓取并写入飞书多维表
  • C++ 红黑树设计与实现详解
  • 微服务监控与运维体系:构建可观测的 Java 微服务
  • 基于 OpenAI API 的 Python 聊天程序开发指南
  • YOLO+OpenClaw+SAM 微调实战:工业缺陷自动标注方案
  • Linux 文件权限修改:chmod、fchmod 与 fchmodat 函数解析
  • Python 下载 ERA5-Land 气象数据的三种方法
  • 大模型商业化:ToB 与 ToC 并非选择题
  • 工业物联网时序数据库选型:InfluxDB 与 Apache IoTDB 对比
  • 零基础转行网络安全:学习路径与职业前景分析
  • Stable Diffusion 3.5 FP8 量化部署:CUDA 与 PyTorch 环境搭建
  • 三大扩散模型性能实测:Z-Image-Turbo、ComfyUI 与 Stable Diffusion 对比
  • LangChain 与大型语言模型集成及 Prompt 模板使用指南
  • CTFshow Web 刷题笔记:web12-20 记录
  • 从菜鸟到架构师:校招宣讲中的技术展示策略
  • 手写 C++ 哈希表:unordered_set/unordered_map 用法、模拟实现与性能对比
  • 基于 YOLOv10 的交通信号灯检测与识别系统实现
  • VR 科普学习机赋能新课堂:沉浸式教育应用

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online