Spring Boot 2.x から 3.x へのアップグレードにおける必須変更事項

はじめに

最近公開された Spring Framework の URL パース関連の脆弱性(CVE-2024-22243)により、Spring Boot 3.x への移行が緊急課題となっています。バージョン 2.x においては当該脆弱性の修正が提供されず、将来的なサポート終了も予想されるため、早期のアーキテクチャ刷新が必要です。

今回のアップグレードは大きなバージョンジャンプとなるため、依存ライブラリ、パッケージ構造、デフォルト設定において多くの相違点が発生します。実務経験に基づき、改修時に注意すべき主要なポイントを整理しました。

1. 実行環境の要件変更

Spring Boot 3.0 は最低でも Java 17 を要求します。旧バージョンで採用されていた JDK 8 や 11 では動作しないため、ビルド環境およびランタイム環境の更新が最優先となります。

2. 設定ファイルの変更

2.1 Redis 接続設定

プロパティ名のネスト構造に変更があります。従来の配置から、以下のように spring.data.redis 配下へ階層が追加されました。

  • 変更前:spring.redis.host
  • 変更後:spring.data.redis.host

2.2 ロギング設定

ログのローテーションや保持期間の設定項目が増加しており、構成に logging.logback ノードの使用が推奨されます。

3. ソースコードの修正対応

3.1 JDBC ドライバの更新

MySQL コネクタのパッケージ名が変更されました。旧的な mysql-connector-java から、新しい mysql-connector-j へ切り替える必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 新しい MySQL ドライバ -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

3.2 javax から jakarta への命名空間変換

Jakarta EE への完全移行に伴い、以下のパッケージ群が置き換えられます。

  • Servlet: javax.servlet.*jakarta.servlet.* (例:HttpServletRequest, ServletResponse
  • Validation: javax.validation.*jakarta.validation.* (例:@Valid, @NotNull
  • Persistence: javax.persistence.*jakarta.persistence.*
  • Annotation/Transaction: 同様に jakarta.annotation.* / jakarta.transaction.* へ変更

3.3 CORS 設定の実装差異

Cross-Origin Resource Sharing の設定方法が一部変更されました。addAllowedOrigin メソッドは非推奨となり、ワイルドカード指定には addAllowedOriginPattern を使用しなければなりません。

@Configuration
public class SecurityMvcConfig implements WebMvcConfigurer {

    /**
     * CORS 設定の作成
     */
    private CorsConfiguration createCorsSetting() {
        CorsConfiguration config = new CorsConfiguration();
        // 全体を対象とする場合は Pattern を使用
        config.addAllowedOriginPattern("*");
        config.setAllowCredentials(true);
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        return config;
    }

    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterBean() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", createCorsSetting());
        
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    }
}

3.4 URL ルーティングの厳格化

フレームワーク 6.0 以降では、末尾のスラッシュ(Trailing Slash)を無視する挙動がデフォルトで無効化されています。

以前は /list/list/ の両方でアクセス可能でしたが、現在は明示的に定義されたパスのみが受理されます。Python 等の他言語との連携において、クライアント側が末尾にスラッシュをつけている場合、404 エラーを引き起こす可能性があるため、API 定義またはフロントエンド側の修正が必要です。

4. ORM ライブラリの更新

4.1 MyBatis-Plus の対応

マイナーチェンジに合わせて、スタートアートの GAV 座標が変更されました。また、コードジェネレータのバージョン合わせが必要です。

  • 旧依存: mybatis-plus-boot-starter
  • 新依存: mybatis-plus-spring-boot3-starter

コード生成機能を利用している場合、Entity クラスの定義にも変更が生じます。

  1. extends Model<T>implements Serializable へ変更
  2. 不要となった pkVal() メソッドの削除
  3. Mapper インターフェースへの @Mapper アノテーション適用の推奨

5. API ドキュメントツールの変遷

Swagger 2.x は廃止されており、Spring Boot 3 では SpringDoc OpenAPI (Swagger 3) が標準的な選択肢です。未認証アクセスを防ぐために、Filter によるトークン検証ロジックを組み込む設計が推奨されます。

6. 外部サービス連携時の注意点

6.1 Nacos セットアップ

Nacos クラスタを使用する場合、サーバーサイドをバージョン 2.x 以上に引き上げる必要があります。設定管理の移行時には、旧バージョンとの並行運用を行いながら慎重にデータを移行してください。

6.2 共通のトラブルシューティング

アップグレード後に発生しやすい現象として、以下の事例が確認されています。

  • RestTemplate 通信エラー: WeChat API 等への POST リクエストで 412 Precondition Failed が返る場合、ヘッダー設定の見直しが必要。
  • 動的プロパティ値取得不可: @NacosValue による注入が機能しない場合、依存関係やプロトコルバージョンの不整合を確認。

タグ: spring-boot java-17 jakarta-ee MyBatis-Plus Nacos

5月20日 19:33 投稿