SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

遇到了一个 Spring Boot 3 整合 MyBatis 的问题,然后处理了。当然,这其实不是个大问题,只是自己编码时遇到了,然后总结总结共享一下。假如有遇到类似问题的,能够参考一下。

告知一下布景

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

最近在熟悉 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>

问题呈现

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

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

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

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

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

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

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

问题排查

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

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

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

为什么说有意思呢?

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

假如真的是版别晋级导致的,还真就暂时无法改,只能等 MyBatis 那儿也发布新版别才行。除了 MyBatis 之外,假如运用 Spring Boot 3 直接整合 MyBatis-Plus 这种结构,那必定也会报错的。

别的,不止是 MyBatis 结构会出问题。像 Spring 6 这种直接嘎掉一些类的状况,假如其它结构里用到了一些 Spring 结构中的类,刚好也被嘎了。那么,晋级到 Spring6 或许 Spring Boot 3 时,都得留意一下。

处理问题:需求晋级版别

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

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

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

对的,运用 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>

2022 年 11 月26 日凌晨,mybatis-spring-boot 正式发布 3.0.0 版别,完全支持 Spring Boot 3 了。

SpringBoot3整合MyBatis报错:Property sqlSessionFactory or sqlSessionTemplate required

因而,现在就能够直接在pom.xml文件中引入正式版别了,不需求再运用SNAPSHOT版别了,代码如下:

<dependencies>
    <!-- 引入 3.0.0 版别的 mybatis-spring-boot-starter(正式版) -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
</dependencies>

总结

工作不大,原本不想单独写篇文章的,但是我有个预见,在项目中晋级 Spring Boot 3 时还会有其它问题。不知道 Spring6 这次更新了多少东西,连 TM 的MyBatis、MyBatis-Plus 这种常用的结构都中招了。这些就渐渐整理吧,毕竟是大版别晋级,难免会呈现不兼容、等依靠更新的状况。的确没辙,等更新呗。

假如这篇文章浪费了你的时刻,先说声抱愧,你直接关掉网页就好。

除注明转载/出处外,皆为作者原创,欢迎转载,但未经作者同意有必要保存此段声明,且在文章页面显着位置给出原文链接,否则保存追查法律责任的权利。