返回專案列表
Java 8 與 Spring Boot 2 升級為 Java 17 與 Spring Boot 3 的插畫

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 輔助測試
01.

要解決的問題

大哥付隨帳收是串接多套帳務系統、並提供 API 給外部廠商的平台。Checkmarx 與 WhiteSource 的掃描持續列出舊版相依套件的弱點,要根本修補,需要升級到仍受支援的版本。

這是一次跨大版本的升級,影響範圍包含 JDK、Spring Boot 與 Spring Security。因為平台會被外部廠商呼叫,升級後行為不能改變,所以先把測試補齊,再進行升級。

02.

主要的調整項目

這次升級需要處理的改動主要有三類:

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();
  }
}

示意用的寫法,路徑與類別名稱皆為假資料。

03.

測試策略

升級的風險在於行為被悄悄改變。因此先建立測試作為安全網,再同時升級 JDK 與 Spring Boot,並善用 AI 縮短補測試的時間。

  1. 01

    補齊單元測試

    先請 AI 為既有程式補齊單元測試,讓升級後能快速發現邏輯改變。

  2. 02

    列出所有 API

    請 AI 列出系統所有 API,並為每支 API 撰寫測試案例。

  3. 03

    自動化測試腳本

    針對可重複呼叫、或可以 rollback 的 API,請 AI 產生自動化測試腳本。

  4. 04

    手動測試

    無法 rollback 的 API 不適合反覆自動化執行,改以手動測試補足。

  5. 05

    同時升級

    JDK 與 Spring Boot 同時升級,完成上述三類調整後,以測試驗證行為一致。

  6. 06

    上線後驗證

    上線後執行 Regression Test,全數通過。

04.

成果

  • >完成 JDK 17 + Spring Boot 3 升級並上線,上線後 Regression Test 全數通過。
  • >升級至仍受支援的版本,作為修補 Checkmarx、WhiteSource 弱點的主要手段。
  • >留下單元測試與 API 自動化測試腳本,可供日後升級與維護重複使用。