はじめに
最近公開された 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 クラスの定義にも変更が生じます。
extends Model<T>→implements Serializableへ変更- 不要となった
pkVal()メソッドの削除 - 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による注入が機能しない場合、依存関係やプロトコルバージョンの不整合を確認。