
Java 8 到 17 的升級之旅
大哥付隨帳收從 JDK 8 + Spring Boot 2 升級至 JDK 17 + Spring Boot 3,以 AI 輔助補齊測試作為安全網
為修補 Checkmarx、WhiteSource 掃描出的弱點,將大哥付隨帳收同時從 JDK 8 + Spring Boot 2 升級至 JDK 17 + Spring Boot 3。升級前先請 AI 補齊單元測試,並列出所有 API、為每支 API 撰寫測試案例;可重複呼叫或可 rollback 的 API 由 AI 產生自動化測試腳本,無法 rollback 的 API 則以手動測試補足,上線後 Regression Test 全數通過。
- 角色
- 需求分析、架構設計、開發、測試
- 使用技術
- JDK 17Spring Boot 3Spring SecurityJakarta EEDockerCheckmarxWhiteSourceJUnitAI 輔助測試
要解決的問題
大哥付隨帳收是串接多套帳務系統、並提供 API 給外部廠商的平台。Checkmarx 與 WhiteSource 的掃描持續列出舊版相依套件的弱點,要根本修補,需要升級到仍受支援的版本。
這是一次跨大版本的升級,影響範圍包含 JDK、Spring Boot 與 Spring Security。因為平台會被外部廠商呼叫,升級後行為不能改變,所以先把測試補齊,再進行升級。
主要的調整項目
這次升級需要處理的改動主要有三類:
- javax.* → jakarta.*
- Spring Boot 3 改用 Jakarta EE,程式中的 javax 套件需要全面改為 jakarta。
- Spring Security 設定
- Spring Security 6 移除 WebSecurityConfigurerAdapter,改以 SecurityFilterChain Bean 設定,授權的寫法也一併調整。
- Dockerfile
- 基底映像改為 JDK 17,並調整對應的建置與啟動設定。
改寫範例
以 Spring Security 設定為例,舊寫法繼承 WebSecurityConfigurerAdapter,新寫法改為註冊 SecurityFilterChain,套件也從 javax 換成 jakarta。
Spring Boot 2
import javax.servlet.http.HttpServletRequest;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.anyRequest().authenticated();
}
}Spring Boot 3
import jakarta.servlet.http.HttpServletRequest;
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated());
return http.build();
}
}示意用的寫法,路徑與類別名稱皆為假資料。
測試策略
升級的風險在於行為被悄悄改變。因此先建立測試作為安全網,再同時升級 JDK 與 Spring Boot,並善用 AI 縮短補測試的時間。
- 01
補齊單元測試
先請 AI 為既有程式補齊單元測試,讓升級後能快速發現邏輯改變。
- 02
列出所有 API
請 AI 列出系統所有 API,並為每支 API 撰寫測試案例。
- 03
自動化測試腳本
針對可重複呼叫、或可以 rollback 的 API,請 AI 產生自動化測試腳本。
- 04
手動測試
無法 rollback 的 API 不適合反覆自動化執行,改以手動測試補足。
- 05
同時升級
JDK 與 Spring Boot 同時升級,完成上述三類調整後,以測試驗證行為一致。
- 06
上線後驗證
上線後執行 Regression Test,全數通過。
成果
- >完成 JDK 17 + Spring Boot 3 升級並上線,上線後 Regression Test 全數通過。
- >升級至仍受支援的版本,作為修補 Checkmarx、WhiteSource 弱點的主要手段。
- >留下單元測試與 API 自動化測試腳本,可供日後升級與維護重複使用。