| |

Spring Boot 4への移行手順:Spring Boot 3.5から何が変わる?

はじめに

Spring Boot 4.0は2025年11月20日にリリースされました。Spring Boot 3.5は長期サポート版(LTS)として2025年5月22日に提供され、OSSサポートは2026年6月30日までで終了する予定です。
本記事では、Spring Boot 3.5から4.0への移行ポイントをまとめ、新機能や注意点をコード例とともに総合的に紹介します。

Spring Boot 4の注目ポイント

  • モジュール化 – Spring Boot 4では内部モジュールが細分化され、必要な部分だけを依存関係に含められるようになりました。これにより、起動時間やバイナリサイズの最適化が期待できます。
  • HTTP Service ClientのサポートRestTemplateWebClientに加え、宣言的なHTTPクライアントが実装されました。インタフェースに@HttpExchange@GetExchangeなどのアノテーションを付与するだけで、実装コードを持たないHTTPクライアントが自動生成されます。
  • API Versioningの標準化 – Spring Framework 7では@RequestMappingversion属性が追加され、ヘッダーやパスセグメント、クエリパラメータによるAPIバージョニングが容易になりました。
  • リトライAPIと観横性の強化 – 失敗時の再試行を行うRetryableアノテーションが追加され、Micrometerによるメトリクス収集やOpenTelemetryスターターが組み込まれました。
  • Java 25対応 – Java 17以降が必須となり、最新のJava 25もサポートされます。GraalVM 25やKotlin 2.2以降にも対応しています。

Spring Boot 3.5と4.0の主な違い

項目Spring Boot 3.5Spring Boot 4.0
リリース日2025年5月22日2025年11月20日
対応JavaJDK 17〜21JDK 17以上、Java 25まで
基盤となるSpring Framework6.x7.x
Jakarta EE1011 (Servlet 6.1ベース)
HTTPクライアントRestTemplate/WebClientHTTP Service Client
API Versioning独自実装が必要version属性と設定で標準サポート
削除されたモジュールUndertowサーバー、Pulsarリアクティブなど

上の表は概要なので、利用しているライブラリやアプリの構成によって影響範囲は異なります。

図1は、Spring Boot 3.5と4.0の主要な違いを図解したものです。この記事では後ほど画像を挿入します。

Spring Boot 3.5とSpring Boot 4.0の移行ポイントを比較した図

移行前のチェックリスト

  1. 3.5.xへのアップグレード – 3.5系列の最新パッチを適用しておきます。Spring Bootのメジャーバージョンアップは段階的に行うのが推奨されます。
  2. JDK 17以上に更新 – Spring Boot 4はJava 17以上が必須です。Java 21や25にする場合は、依存ライブラリの互換性も確認してください。
  3. 依存ライブラリの更新 – Spring Cloudなど周辺のスタータをSpring Boot 4対応版に上げます。
  4. Undertow等の削除モジュールを確認 – Undertowサーバーはサポートされなくなりました。TomcatやJettyに切り替えが必要です。
  5. 設定プロパティの変更点を確認spring-boot-properties-migratorを依存関係に追加すると、起動時に廃止・リネームされたプロパティを検出できます。

移行手順

1. ビルドファイルの更新

Gradleの場合の例です。build.gradleのバージョン定義を更新し、Javaバージョンを17以上に設定します。

plugins {
    id 'java'
    id 'org.springframework.boot' version '4.0.1' // Spring Boot 4へ更新
    id 'io.spring.dependency-management' version '1.1.4'
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 必要に応じて新しいスターター名に変更
    // 例: UndertowからTomcatに変更する場合は下記を追加
    // implementation 'org.springframework.boot:spring-boot-starter-tomcat'
}

Mavenの場合はspring-boot-starter-parentのversionを4.x系に更新し、maven-compiler-pluginでJava 17を指定します。

2. 削除・変更されたスターターの調整

Spring Boot 4では一部スターター名やモジュール構成が変わりました。例として、spring-boot-starter-data-mongodbは構成が細分化され、反応型のMongoDBサポートが別モジュールになっています。公式のリリースノートで依存関係の移行先を確認しましょう。

Undertowサーバーを使っていた場合は、TomcatまたはJettyに変更します。build.gradlespring-boot-starter-undertowを削除し、spring-boot-starter-tomcatを追加してください。

3. 設定プロパティの更新

spring-boot-properties-migratorを開発プロファイルに追加し、アプリを起動します。

gradle
dependencies {
    runtimeOnly 'org.springframework.boot:spring-boot-properties-migrator'
}

起動ログに「The configuration property … has been renamed to …」のようなメッセージが表示されるので、設定ファイル(application.yml)を修正します。移行が完了したらspring-boot-properties-migratorは削除します。

4. HTTP Service Clientの実装例

Spring Boot 4では宣言的なHTTPクライアントが標準で用意されました。例えば外部APIを呼び出すUserClientを作る場合、以下のようにインタフェースを定義します。

package com.example.client;

import org.springframework.web.service.annotation.GetExchange;
import org.springframework.web.service.annotation.HttpExchange;
import reactor.core.publisher.Mono;

@HttpExchange(url = "https://api.example.com")
public interface UserClient {

    @GetExchange("/users/{id}")
    Mono<User> getUserById(@PathVariable("id") Long id);

    @PostExchange("/users")
    Mono<User> createUser(@RequestBody User user);
}

@HttpExchangeでベースURLを定義し、各メソッドに@GetExchange@PostExchangeを付けるだけで、Springが実装を自動生成します。クライアントの生成は以下のように行います。

@Configuration
public class ClientConfig {

    @Bean
    UserClient userClient(RestClient.Builder builder) {
        return HttpServiceProxyFactory
            .builder(builder.build())
            .build()
            .createClient(UserClient.class);
    }
}

5. API Versioningの設定例

Spring Boot 4ではAPIバージョニングが組み込みでサポートされます。
application.ymlでバージョニング方式とサポートするバージョンを設定し、各エンドポイントにversion属性を付けます。

# application.yml
spring:
  mvc:
    apiversion:
      strategies: path
      supported: v1,v2
      default: v1

コントローラでは以下のようにバージョンごとにメソッドを定義します。

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping(value = "/users", version = "v1")
    public List<UserV1> listUsersV1() {
        // v1のレスポンス
    }

    @GetMapping(value = "/users", version = "v2")
    public List<UserV2> listUsersV2() {
        // v2のレスポンス
    }
}

バージョン情報が送られていない場合はデフォルトバージョン(v1)が適用され、存在しないバージョンを指定するとMissingApiVersionExceptionがスローされます。
ヘッダーやクエリパラメータによる指定に切り替えたい場合はstrategies: headerstrategies: query_parameterを設定します。

6. 移行後のテストとリリース

コードを修正したら、アプリケーションを起動して既存の機能が正しく動作するか確認します。APIバージョニングやHTTPクライアントは新しい機能なので、テストケースを用意して挙動を検証しましょう。Spring Boot 4では多くの依存ライブラリが更新されているため、3rd partyライブラリとの互換性も要チェックです。

おわりに

Spring Boot 4は、モジュール化や宣言的HTTPクライアント、APIバージョニングといった新機能により、より派手なアプリケーション開発を支援します。
一方で、Java 17以上が必須になるなどシステム要件が変わるため、早めに検討環境で移行を試すことをおすすめします。
この記事を参考に、段階的なアップグレード計画を立て、最新のspringエコシステムを活用してください。

是非フォローしてください

最新の情報をお伝えします

類似投稿