百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or

wptr33 2025-01-12 19:03 18 浏览

遇到了一个 Spring Boot 3 整合 MyBatis 的问题,然后解决了。当然,这其实不是个大问题,只是自己编码时遇到了,然后总结总结分享一下。如果有遇到类似问题的,可以参考一下。

交代一下背景

最近在熟悉 Spring Boot 3 版本的代码,开发过程中遇到了一些小坑,不过很快都解决了。然后就用 Spring Boot 3 版本写了几个小 demo,比如 Web 开发、连接数据库、使用 JdbcTemplate 操作数据库,编码和测试都非常顺利,虽然是从 Spring Boot 2.x 版本升级到 Spring Boot 3,但是没有感觉到太多差别。

不过,在使用 Spring Boot 3 整合 MyBatis 时出现了一些问题,花了不少时间处理。

使用的版本如下所示。

  • Spring Boot 版本配置
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.0-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
复制代码
  • MyBatis 版本配置
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
复制代码

问题出现

启动时直接报错,内容如下图所示。

当然,异常信息挺多,比如无法创建 Bean 的异常等等,不过上面的几个异常并不是问题主因。这里我直接定位到最后的异常上,异常信息是:

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
复制代码

跟入发生异常的地方,代码截图如下:

问题原因也很明显,sqlSessionTemplate 对象是空的。

问题排查

当然,由于把 Spring Boot 版本升级到 3 了,所以会觉得有很大的可能是版本升级导致了问题。

不过还是想自己查查问题,就依次检查了代码、数据库配置、MyBatis 配置,都没有发现哪里写错了,接着就没头绪了。之后又看了一下 MyBatis 自动配置的源码,通过 debug 模式看了下是不是有什么问题,在查看源码的过程中看到一个有意思的事情,SqlSessionFactoryBean 这个类直接报红了,如下图所示。

为什么说有意思呢?

正常情况下这个类肯定不会报错的。再去查询问题,发现 NestedIOException 这个类在 Spring 6 版本中直接删除了。对的,直接删除了。而 MyBatis 还没有同步更新,所以直接就报红了。

如果真的是版本升级导致的,还真就暂时没法改,只能等 MyBatis 那边也发布新版本才行。除了 MyBatis 之外,如果使用 Spring Boot 3 直接整合 MyBatis-Plus 这种框架,那肯定也会报错的。

另外,不止是 MyBatis 框架会出问题。像 Spring 6 这种直接嘎掉一些类的情况,如果其它框架里用到了一些 Spring 框架中的类,恰好也被嘎了。那么,升级到 Spring6 或者 Spring Boot 3 时,都得注意一下。

解决问题:需要升级版本

好的,排查自己的代码没发现问题。只有去古狗上看看有没有解决方案,搜了一圈,在 MyBatis 的开源仓库里看到了一个类似问题,解决方案也有,如下图所示。

对的,使用 Spring Boot 3 版本整合 MyBatis 时,需要把 mybatis-spring-boot-starter 也升级。mybatis-spring-boot-starter 2.x 版本暂时还不适配 Spring Boot 3 版本,没辙。另外,由于还没正式发版,所以需要配置一个远程仓库。

<dependencies>
    <!-- 引入 3.0.0-SNAPSHOT 版本的 mybatis-spring-boot-starter(未正式发版) -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<repositories>
    <!-- 由于未正式发版,所以在Maven仓库里还搜不到,需要额外配置一个远程仓库 -->
    <repository>
        <id>ossrh</id>
        <name>OSS Snapshot repository</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>
复制代码

总结

事情不大,本来不想单独写篇文章的,但是我有个预感,在项目中升级 Spring Boot 3 时还会有其它问题。不知道 Spring6 这次更新了多少东西,连 TM 的MyBatis、MyBatis-Plus 这种常用的框架都中招了。这些就慢慢整理吧,毕竟是大版本升级,难免会出现不兼容、等依赖更新的情况。确实没辙,等更新呗。

相关推荐

威信Chronosonic XVX全新旗舰全球首发 设计特点彻底公开

第一眼看到WilsonAudio新推出的ChronosonicXVX音箱,相信大家都会直觉认为它是两年前超级旗舰WAMMMasterChronosonic的缩小版,不过这个推测并不完全正确。C...

C#高精度Timer和Delay以及时间测量

在PCHMI7.0后在工具箱里会多一个MsTimer,以及Delay和Microsecond两个类。...

python教程从基础到精通,第9课—日期与时间

Hello,小伙伴们,祝大家五.一玩得快乐!刚学习完了七大数据类型,今天咱们来学习日期与时间的表示方法。Python标准库中提供了时间和日期的支持:calendar:日历相关;time、datetim...

软件测试|教你轻松玩转Python日期时间

Python基础之日期时间处理...

Go语言中互斥锁与读写锁,你知多少?

简述Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段。在Go中主要使用sync.Mutex的结构体表示。一个简单的示例:funcmutex()...

变形金刚动画大电影——经典台词赏析

YOURDAYSARENUMBEREDNOW,DECEPTI-CREEPS你们活不了多久了,霸天虎小子。-{铁皮说的话,体现了铁皮的嫉恶如仇,可是后来铁皮在飞船上遇袭身亡,可谓是出师未捷身先...

Python时间日期模块使用教程(python3日期)

1.时间日期处理概述在日常编程中,时间日期处理是非常常见的需求,比如:记录日志时间...

亚马逊介绍AWS“无服务器”云服务改进:数据库可线上扩充容量等

IT之家11月29日消息,在今天于美国拉斯维加斯展开的亚马逊“AWSre:Invent2023”活动中,亚马逊计算部门资深副总裁PeterDeSantis,介绍了旗下三款云端服务,IT...

2.日期格式 datetime(日期时间显示格式)

fromdatetimeimportdatetime1.获取当前日期和时间now=datetime.now()#2025-05-3110:56:01.4687822.格式化日期...

【科普】时间单位大盘点(时间单位都有哪些?)

时间单位,是7种基本单位之一,长度、时间、质量、物质的量、光照度、电流和(热力学)温度是七种基本单位。本词条中时间单位以时间从大到小列。今天我们来盘点下时间的单位换算...

基于PHP的Laravel框架,盘点Github高星Web管理后台,效率为王!

在Web开发工作中,选择一个高效、稳定的后台管理系统是提高开发效率的关键。虽然PHP在近些年中的热度有所减退,但其上手简单、开源、灵活且被广泛应用的特点,仍然使其在编程语言排行榜中保持前十的位置。这表...

如何使用PHP编写一个简单的留言板?

留言板是一个常见的Web应用程序,允许用户在网站上发布和查看留言。在本文中,我们将使用PHP编写一个简单的留言板,介绍构建过程中的关键步骤和技巧。一、准备工作在开始编写留言板之前,我们需要准备好以下工...

产品经理提需求时要考虑的 15 个隐性需求

虽然世界充满未知的变化,但是有一些大的方向还是可以把握的,本文跟大家谈谈产品经理提需求时要考虑的15个隐性需求,enjoy~俗话说,计划赶不上变化快,无论需求文档做得如何细致,考虑得如何周全,总会...

关于 PHP 启动 MongoDb 找不到指定模块问题

前言:最近有一个小demo,需要通过PHP将用户行为记录储存到MongoDB,再用Spark做协同过滤。由于以前处理跨语言交互是通过消息中间件,这次本地使用MongoDB却弄出了几个问...

PHP程序员老鸟面试经历(php程序员怎么样)

在任何时代找任何工作都有面试这么一说的。特别是高端技术类的工种对技术理论和技术实操能力要求很严格。大部分公司招收技术员工的要求也越来愈高。至于PHP程序员也是如此,我估计大多数PHP老鸟已经不在意所...