Spring Framework 7.0.7がリリースされました。多数の不具合修正に加え、バリデーション性能の改善、RestClient向けのテスト支援、Kotlin SerializationによるJSON配列のFlux対応、JDK 24環境でのメタデータ処理修正など、既存システムの安定性と将来の移行に関わる変更が含まれています。
今回のリリースは、すべてのプロジェクトが即座に大規模改修を必要とするタイプではありません。一方で、Spring Framework 7系を利用している、またはJDK 24・RestClient・リアクティブ処理・マルチテナンシーを採用している場合は、アップデートの優先度が高いリリースです。
RestTemplateからRestClientへ移行するチームにとって重要な変更
SpringのHTTPクライアントでは、従来のRestTemplateからRestClientへの移行を検討するプロジェクトが増えています。7.0.7では、MockRestServiceServerにRestClient用のcreateServerバリアントが追加され、RestClientを使ったコードのテストを既存のSpring Testの考え方に近い形で構築しやすくなりました。
また、RestTemplateXhrTransportに代わるRestClientXhrTransportのバリアントも追加されています。WebSocketや関連するクライアント通信で、RestClientを中心とした構成へ移行する場合に確認したい変更です。
移行時には、単にAPI呼び出し部分を置き換えるだけでなく、次の点を確認してください。
- MockRestServiceServerを利用したテストがRestClientの実装に接続されているか
- タイムアウト、ヘッダー、エラー処理、レスポンスボディの扱いが変わっていないか
- ResponseEntityを利用している処理で、ストリームのクローズタイミングが期待どおりか
- RestClientAdapterで設定しているデフォルトAPIバージョンが維持されるか
特に今回、RestClientがResponseEntityのレスポンスに対してストリームを閉じてしまう問題が修正されています。大容量ファイルやストリーミングレスポンスを扱うアプリケーションでは、アップデート後にリソース解放とダウンロード完了までの挙動を再検証する価値があります。
JDK 24利用時はアノテーション処理とクラス解析を重点確認
JDK 24以降では、AnnotatedTypeMetadataがJavaソース上の宣言順を保持しなくなる問題や、ClassFileバリアントでメソッド戻り値型のメタデータが不正になる問題が修正されています。MergedAnnotationやAnnotationBeanNameGeneratorが、存在しないクラスを参照するアノテーションで失敗する問題も対象です。
これらは通常の業務ロジックよりも、起動時のコンポーネントスキャン、条件付きBean登録、アノテーション解析、AOTやテスト基盤で表面化しやすい問題です。JDK 24への更新を予定している場合は、次のような検証をCIに追加すると安全です。
- アノテーション付きコンポーネントの起動テスト
- 条件付き設定やImportSelectorを使う構成のテスト
- Bean定義の登録順序に依存していないかの確認
- AOT、テスト実行、開発環境と本番環境でのJDK差分の確認
JDK更新とSpring更新を同時に行う場合は、原因切り分けのため、可能であればそれぞれの変更を分けた検証も有効です。
バリデーション性能改善は高トラフィックAPIほど効果を確認しやすい
SpringValidatorAdapterとMethodValidationAdapterの性能が改善されました。入力検証は一回あたりの処理時間が小さく見えても、APIリクエスト数が多いサービスや、複数の引数・ネストしたオブジェクトを検証するサービスでは、CPU使用率やレイテンシーに影響します。
アップデートの効果を確認する際は、単純なマイクロベンチマークだけでなく、実際のリクエストに近い条件で測定することが重要です。例えば、次の指標を更新前後で比較します。
- p95、p99のリクエストレイテンシー
- バリデーションを含むエンドポイントのCPU使用率
- エラー応答時の処理時間
- 大量のフィールドエラーが発生した場合のメモリ使用量
FieldErrorのデフォルトメッセージによるキャッシュ汚染も修正されています。入力値やフィールド情報の組み合わせによって高カーディナリティなメッセージが生成されるアプリケーションでは、キャッシュサイズやヒープ使用量の推移も確認対象になります。
ストリーミング、SSE、マルチパート処理の再テストを優先
今回の修正には、SSEのフラッシュ関連の回帰、マルチパートcodecのエラーハンドリング、Writerのライフサイクル、リソースリゾルバーのコーディング判定など、レスポンスを書き出す処理に関係するものが含まれています。
ストリーミングAPIでは、通常のJSONレスポンスと異なり、データの到着単位、flushのタイミング、接続切断時の後処理がユーザー体験やサーバー負荷に直結します。SSEや大容量ファイル、multipartアップロードを使っている場合は、次のケースを実環境に近い条件で確認してください。
- クライアントが途中で切断した場合
- 長時間接続で定期的にデータをflushする場合
- 不正なmultipartデータを受け取った場合
- Content-Typeや文字コードが明示されない場合
- InputStreamやWriterをアプリケーション側で管理する場合
WebTestClientでnull要素を含むリストをアサートできない問題も修正されています。リアクティブなAPIの契約テストを強化するきっかけにもなります。
Hibernateのスキーマ・マルチテナンシー利用者はDB接続周りを確認
LazyConnectionDataSourceProxyがHibernateのスキーマ方式によるマルチテナンシーとうまく動作しない問題が修正されました。さらに、ターゲットConnectionへholdabilityが渡されない問題も修正されています。
テナントごとにスキーマを切り替える構成では、接続取得の遅延、トランザクション境界、現在スキーマの設定タイミングが重要です。更新後は、少なくとも以下を確認してください。
- テナントAのリクエストがテナントBのスキーマを参照しないこと
- トランザクション開始前後でスキーマ設定が維持されること
- コネクションプールへの返却後に状態がリークしないこと
- ロールバックや例外発生時に正しい接続状態へ戻ること
- Hibernateのスキーマ方式とTransactionAwareDataSourceProxyの組み合わせ
本番データを使う前に、複数テナントを並列実行する統合テストを用意しておくと、アップデートによる接続管理の変化を検出しやすくなります。
APIの非推奨化とシグネチャ変更にも注意
CacheAspectSupportのmethodIdentification()は削除予定として非推奨になりました。独自のキャッシュアスペクトやログ出力、監視処理でこのメソッドを参照している場合は、将来の削除に備えて代替手段を確認してください。
また、ApiVersionConfigurer.setSupportedVersionPredicate()は、ApiVersionConfigurerを返す形式からvoidを返す形式へ変更されています。メソッドチェーンで記述しているコードはコンパイルエラーになる可能性があるため、APIバージョニング機能を利用している場合はソース互換性を確認する必要があります。
このような変更は、アプリケーションの実行時には問題がなくても、ビルド時に初めて検出されます。依存関係を更新する際は、単体テストだけでなく、すべてのモジュールを含むクリーンビルドを実行してください。
依存関係更新による間接的な影響
依存関係としてMicrometer 1.16.5とReactor 2025.0.5へ更新されています。Observabilityやリアクティブ処理を利用するシステムでは、Spring Framework本体の変更だけでなく、メトリクス名、Observation、Scheduler、エラー処理などの周辺挙動も確認対象です。
特に、MicrometerのObservationを利用している場合は、既存のダッシュボードやアラートが引き続きデータを取得できているかを確認します。Reactorについては、負荷試験でスループットだけを見るのではなく、キャンセル、タイムアウト、バックプレッシャー、エラー伝播の挙動も確認するとよいでしょう。
アップデートすべきプロジェクトと確認項目
Spring Framework 7.0.7への更新を優先的に検討したいのは、次のようなプロジェクトです。
- JDK 24以降への移行を予定している
- RestClientへの移行を進めている、またはRestTemplateと併用している
- 高トラフィックなAPIでMethod Validationを多用している
- SSE、multipart、ストリーミングレスポンスを提供している
- Kotlin SerializationとFluxを組み合わせている
- Hibernateのスキーマ方式マルチテナンシーを利用している
- WebSocket、CORS、Accept-LanguageなどHTTP境界の挙動に依存している
- Spring Framework内部APIや非推奨APIを利用している
更新手順としては、まず依存関係を固定した検証ブランチを作成し、クリーンビルド、単体テスト、統合テスト、HTTPクライアントの契約テスト、負荷試験の順に確認するのが現実的です。特にRestClient、ストリーミング、DB接続、JDK 24の4領域は、コンパイルが通るだけでは安全性を判断できません。
Spring Framework 7.0.7は、派手な新機能を追加するというより、次世代のHTTPクライアント構成や新しいJDK、リアクティブ・ストリーミング処理へ移行する際の土台を整えるリリースです。該当する機能を利用しているチームは、単なるバージョンアップではなく、移行計画とテスト戦略を見直す機会として活用するとよいでしょう。
