Skip to content

Spring Boot 4.1系とkeel 3.0.0へ追随 - #48

Open
kumagoro1202 wants to merge 1 commit into
developfrom
feature/spring-boot-4.1-and-keel-3.0.0
Open

Spring Boot 4.1系とkeel 3.0.0へ追随#48
kumagoro1202 wants to merge 1 commit into
developfrom
feature/spring-boot-4.1-and-keel-3.0.0

Conversation

@kumagoro1202

Copy link
Copy Markdown
Contributor

Important

このPRは keel v3.0.0 が Maven Central へ公開された後にマージしてください。
それ以前にマージすると、公開ドキュメントが存在しない版を参照することになります。
公開後、マージ前に「Maven Central からの解決確認」(後述)を実施してください。

概要

サンプルアプリケーション群を Spring Boot 4.1.0 系へ更新し、あわせて keel を v3.0.0 へ追随させます。
サンプルの親は spring-boot-starter-parent:3.2.0(2023-12-22 が最終更新)で停止していたため、
Spring Boot 4 系までの変更をまとめて取り込んでいます。

主な変更

ライブラリのバージョン更新(samples/pom.xml

ライブラリ 変更前 変更後
spring-boot-starter-parent 3.2.0 4.1.0
jp.fintan.keel:keel-spring-boot-starter-web 2.0.0 3.0.0
doma-spring-boot-starter 1.7.0 3.0.0
doma-processor / doma-slf4j 2.53.1 3.11.1
mybatis-spring-boot-starter 3.0.3 4.1.0
spring-cloud-aws-dependencies 3.1.0 4.1.0
rider-spring / rider-junit5 1.35.0 1.44.0
logback-access-spring-boot-starter 4.0.0 5.1.0
logbook-spring-boot-starter 3.7.1 4.1.0

testcontainers-bom の import は削除しました(Spring Boot 4 系が管理するようになったため)。

Spring Boot 4 系のモジュール分割への追随

Spring Boot 4 系では自動設定が機能単位のモジュールへ分割されたため、各サンプルの依存を修正しています。

  • Flyway の自動設定 → spring-boot-starter-flyway 経由で宣言
  • RestTemplateBuilderspring-boot-starter-restclient を追加
  • テスト → spring-boot-starter-test から spring-boot-starter-webmvc-test
  • Testcontainers のモジュール名変更(junit-jupitertestcontainers-junit-jupiter ほか)

依存解決の不整合への対処

logbook 4.1.0 は Jackson 3 を利用するため json-path 3.0.0 以上を必要としますが、
Spring Boot 4.1.0 が管理する json-path は 2.10.0 で、Jackson 3 向けの JsonProvider を含みません。
そのままでは実行時に NoClassDefFoundErrorJackson3JsonNodeJsonProvider)となるため、
samples/pom.xmljson-path.version を 3.0.0 に引き上げています。

仕様変更に伴うテスト・設定の修正

  • Content-Disposition の符号化: Spring Framework 7 系では、filename
    RFC 2047 形式(=?UTF-8?Q?...?=)ではなく ASCII のみのフォールバックとなり、
    実際のファイル名は RFC 5987 形式の filename* で表現されるよう変更されました。
    期待値を修正し、不要になった commons-codec への依存も削除しています。
  • セキュリティ自動設定の FQCN 変更: org.springframework.boot.autoconfigure.security.* から
    org.springframework.boot.security.autoconfigure.* へ移動したため、
    spring.autoconfigure.exclude の指定を更新しました。
  • MockMvc と Spring Security の連携: Spring Boot 4 系では @AutoConfigureMockMvc
    Spring Security の MockMvc 連携を自動適用しなくなったため、springSecurity()
    明示的に適用するよう修正しました(これがないと @WithMockUser が反映されず 401 になります)。
  • Jackson 3 への移行: Spring Boot 4 系は Jackson 3(tools.jackson)を使用するため、
    テストでの ObjectMapper の import を変更しました。なお注釈(jackson-annotations)は
    2 系のままのため、com.fasterxml.jackson.annotation.* は変更していません。
  • spring-boot-starter-batch の依存変更: 4 系では spring-boot-starter-jdbc
    推移的に含まなくなったため、バッチの 2 モジュールへ明示的に追加しました。
  • Spring Batch 6 での循環参照: JobRepository を供給する自動設定自身が Job Bean を
    収集するようになったため、@Configuration のコンストラクタで JobRepository
    受け取ると循環参照になります。@Bean メソッドの引数で受け取る形へ変更しました。
  • spring-cloud-aws の S3Template: S3ObjectConverter が Jackson のクラスパス存在を
    条件に構成されるため、spring-boot-starter-jackson を追加しました。

database-rider と JUnit 6 について(既知の制約)

Spring Boot 4.1 は JUnit 6 を採用しますが、database-rider は最新の 1.44.0 でも
JUnit 5 前提でビルドされており、同一 JVM で複数のテストクラスを続けて実行すると、
クラス内で最初に実行されるテストメソッドへ @DataSet が適用されないことがあります。

暫定対応として api-error-handling の surefire を reuseForks=false にしています。
database-rider が JUnit 6 に対応した時点で、この設定は削除できます。
@DBRider を使用する他の 3 モジュールは現状のテスト内容では問題が表面化していませんが、
同じ制約下にあります。

ドキュメント(doc/conf.py)の参照バージョン更新

サンプルのスタック更新にあわせて、外部ドキュメントへのリンク先バージョンを更新しました。
Spring Boot 4 系はリファレンスの URL 体系が変わっている(/spring-boot/<version>/ 配下へ移動し、
/spring-boot/docs/<version>/reference/html/ は提供されない)ため、.rst 側の参照パスも
あわせて修正しています。

確認したこと

  • samples 配下のビルド(テスト含む)が成功すること
  • 依存ツリーに Spring Boot 3 系・Spring Framework 6 系が残っていないこと
  • docliteralinclude が指す区間マーカーが実ファイルに存在し、埋め込み対象がずれていないこと
  • Sphinx の HTML ビルドおよび linkcheck

マージ前に必要な確認(keel v3.0.0 の公開後)

keel v3.0.0 は本 PR 作成時点で Maven Central に未公開です。検証は、
keel を手元で mvn install したローカルリポジトリ上で行っています。
そのため公開後、空のローカルリポジトリで Central からのみ解決できることを確認してから
マージしてください。

mvn -B -Dmaven.repo.local="$(mktemp -d)" clean verify

samples ディレクトリで実行。keel を含む全依存が Maven Central から解決され、
ビルドが成功することを確認する)

サンプルアプリケーションの親を spring-boot-starter-parent:3.2.0 から 4.1.0 へ更新し、
あわせて keel を 2.0.0 から 3.0.0 へ更新する。

Spring Boot 4系での主な追随内容:

- 自動設定のモジュール分割にあわせた依存の追加
  (spring-boot-starter-flyway / spring-boot-starter-restclient /
   spring-boot-starter-webmvc-test / spring-boot-starter-jdbc /
   spring-boot-starter-jackson)
- Testcontainers のモジュール名変更への追随
- Jackson 3 への移行にあわせたテストの import 変更
- Content-Disposition の符号化仕様変更にあわせた期待値の修正
- セキュリティ自動設定の FQCN 変更にあわせた除外指定の更新
- MockMvc への springSecurity() の明示適用
- TestRestTemplate への @AutoConfigureTestRestTemplate の付与
- Spring Batch 6 での循環参照を避けるための JobRepository 受け取り方の変更
- logbook が必要とする json-path 3.0.0 への引き上げ

ドキュメントについても、参照先の外部ドキュメントのバージョンを更新する。
Spring Boot 4系はリファレンスのURL体系が変わっているため、参照パスもあわせて修正する。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants