截止到目前,Springboot最新穩定版本已經迭代到3.0.5,而我們專案中使用的行為驗證碼框架ja-captcha
還沒有適配Springboot3,碼雲上類似的請求也沒有得到過迴應,於是決定自己動手適配一下,研究下來發現適配3.x並沒有那麼難,這裡記錄一下適配過程,希望能幫到他人
首先搭建一個Springboot2的專案,以最簡單的方法整合驗證碼,這裡我選擇使用springboot2.7.5
和ja-captcha1.3.0
,在Maven中新增依賴後直接啟動專案即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
</parent>
<groupId>site.hanzhe.boot3.captcha</groupId>
<artifactId>springboot3-ja-captcha</artifactId>
<version>0.0.1</version>
<description>Springboot3整合ja-captcha行為驗證碼解決方案</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.anji-plus</groupId>
<artifactId>spring-boot-starter-captcha</artifactId>
<version>1.3.0</version>
</dependency>
</dependencies>
</project>
可以看到已經整合成功了,而且呼叫介面測試也一切正常,現在將Springboot版本改成3.0.5
,然後重新整理Maven後重啟一下專案試試看,發現控制檯已經不列印ja-captcha
的紀錄檔了,而且介面也返回404
在整合之前,我們需要了解一下Springboot3.x的兩個重要的變化
第一個變化是Springboot3以JakartaEE 9為基準並支援JakartaEE 10,其實Jakarta就是Java,Oracle將JavaEE移交給了Eclipse基金會,並不允許其使用原本的java名稱,所以Java改名為Jakarta,原javax包名也修改為了jakarta
第二個變化是Springboot自動組態檔的變更,Springboot3廢棄了factories的自動設定,改為使用imports檔案
瞭解這兩點後我們回到整合驗證碼的專案中,首先可以觀察到最明顯的一點,啟動專案後控制檯不在列印ja-captcha
的紀錄檔了,這就代表自動設定並沒有生效,在外部庫中找到ja-captcha
的自動設定,發現它是使用factories進行自動設定的,該方法已經失效,我們需要建立新的自動組態檔來啟用它
在resource目錄下新建META-INF/spring
兩個目錄,在目錄下新增自動組態檔,並將ja-captcha
的自動設定類新增進去然後重啟專案檢視效果,檔名太長我就放在程式碼塊中了
# 檔名
org.springframework.boot.autoconfigure.AutoConfiguration.imports
# 檔案內容
com.anji.captcha.config.AjCaptchaAutoConfiguration
可以看到專案啟動報錯了,不過不用擔心,報錯是好事兒,說明自動設定生效了,提取報錯中的主要資訊,是建立captchaController
這個Bean的時候報錯了,報錯的原因是沒有找到javax/servlet/http/HttpServletRequest
這個類,因為Springboot3中javax的包名統一修改為了jakarta,所以這個類會找不到
這裡直接使用替換法簡單粗暴的解決這個問題,找到報錯的這個類,在專案中建立一個相同包名的的類,將裡面的javax替換為jakarta,這樣在建立Bean的時候Java找到的類是我們自己的jakarta的類,就不會呼叫舊的javax的類了
替換後重啟專案檢視效果,可以發現專案啟動成功,並且控制檯列印了ja-captcha
的啟動紀錄檔,偵錯介面也成功了,整合完成,點選檢視程式碼
本文使用笨方法在Springboot3中使用ja-captcha
,還是希望作者早日做適配
作者多數為原創文章 ( 部分轉載已標出 ),目前資歷尚淺文章內描述可能有誤,對此造成的後果深表歉意,如有錯誤還望指正