天天看點

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

作者:Java解白
SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or
SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

遇到了一個 Spring Boot 3 整合 MyBatis 的問題,然後解決了。當然,這其實不是個大問題,隻是自己編碼時遇到了,然後總結總結分享一下。如果有遇到類似問題的,可以參考一下。

交代一下背景

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

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

當然,異常資訊挺多,比如無法建立 Bean 的異常等等,不過上面的幾個異常并不是問題主因。這裡我直接定位到最後的異常上,異常資訊是:

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

跟入發生異常的地方,代碼截圖如下:

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

問題原因也很明顯,sqlSessionTemplate 對象是空的。

問題排查

當然,由于把 Spring Boot 版本更新到 3 了,是以會覺得有很大的可能是版本更新導緻了問題。

不過還是想自己查查問題,就依次檢查了代碼、資料庫配置、MyBatis 配置,都沒有發現哪裡寫錯了,接着就沒頭緒了。之後又看了一下 MyBatis 自動配置的源碼,通過 debug 模式看了下是不是有什麼問題,在檢視源碼的過程中看到一個有意思的事情,SqlSessionFactoryBean 這個類直接報紅了,如下圖所示。

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

為什麼說有意思呢?

正常情況下這個類肯定不會報錯的。再去查詢問題,發現 NestedIOException 這個類在 Spring 6 版本中直接删除了。對的,直接删除了。而 MyBatis 還沒有同步更新,是以直接就報紅了。

如果真的是版本更新導緻的,還真就暫時沒法改,隻能等 MyBatis 那邊也釋出新版本才行。除了 MyBatis 之外,如果使用 Spring Boot 3 直接整合 MyBatis-Plus 這種架構,那肯定也會報錯的。

另外,不止是 MyBatis 架構會出問題。像 Spring 6 這種直接嘎掉一些類的情況,如果其它架構裡用到了一些 Spring 架構中的類,恰好也被嘎了。那麼,更新到 Spring6 或者 Spring Boot 3 時,都得注意一下。

解決問題:需要更新版本

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

好的,排查自己的代碼沒發現問題。隻有去古狗上看看有沒有解決方案,搜了一圈,在 MyBatis 的開源倉庫裡看到了一個類似問題,解決方案也有,如下圖所示。

SpringBoot3整合MyBatis報錯:Property sqlSessionFactory or

對的,使用 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 這種常用的架構都中招了。這些就慢慢整理吧,畢竟是大版本更新,難免會出現不相容、等依賴更新的情況。确實沒轍,等更新呗。