SpringBoot 3.4がRC版までリリースされています。
Release Notesを参考に3.3系からの変更点をまとめます。
自分が移行するときに関係のあるものや興味があるものが中心となりますがご容赦ください🙇♂️
関連記事はこちら
SpringBoot Updateまとめ【要対応】Gradle要件の変更
gradleのバージョンが7系であれば7.6.4以降、8系であれば8.4以降が必要になります。
プロジェクトのgradleバージョンの更新は、以下のコマンドで実行可能です!
※執筆時点の最新が8.10.2
# メジャーバージョンを上げる場合は事前に非推奨な記述がないかチェック
$ ./gradlew build -x check -x test --warning-mode=fail
# バージョン更新
$ ./gradlew wrapper --gradle-version=8.10.2
【デグレの可能性】ConfigurationPropertisのバリデート範囲の変更
以下のようなネストされたpropertiesクラスがあるとします。
@Data
@Validated
@Component
@ConfigurationProperties(prefix = "sample")
public class SampleProperties {
@Pattern(regexp = "main")
private String value;
private SubProperties sub;
@Data
public static class SubProperties {
@Pattern(regexp = "sub")
private String value;
}
}
3.3までは親クラスにさえ @Validated
を付与していれば、ネストしたクラスもバリデートが実施されました。
3.4からは明示的に 以下のように @Valid
を付与しなければネストクラスのバリデートが効かなくなります。
@Data
@Validated
@Component
@ConfigurationProperties(prefix = "sample")
public class SampleProperties {
@Pattern(regexp = "main")
private String value;
@Valid // !! TODO !! ネストクラスのフィールドにアノテーションを追加
private SubProperties sub;
@Data
public static class SubProperties {
@Pattern(regexp = "sub")
private String value;
}
}
【新機能】MockMvcTester
これまで MockMvcTest
というテスト向けのクラスがありましたが、このサンプルのように
@WebMvcTest(SampleController.class)
class Before {
@Autowired
private MockMvc mockMvc;
@Test
void test() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/mockMvcTest/sample"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().json("""
{
"message": "Hello, World!",
"detail": {
"key1": "value1",
"key2": "value2"
}
}
"""));
}
}
リクエストを送信する時、検証する時、どちらも MockMvcRequestBuilders
や MockMvcResultMatchers
を意識して実装する必要がありました。
(ちなみに僕は覚えられず毎回どこかからコピペするか自分のブログを見直すかしてました。。。)
そんな課題を解決してくれるのが MockMvcTester
です!
上記と同じ内容をMockMvcTester
で実装するとこうなります。
class After {
// MockMvcTesterの初期化
private final MockMvcTester mockMvc = MockMvcTester.of(new SampleController());
@Test
void test() {
mockMvc.get()
.uri("/mockMvcTester/sample")
.assertThat()
.hasStatusOk()
.bodyJson().isLenientlyEqualTo("""
{
"message": "Hello, World!",
"detail": {
"key1": "value1",
"key2": "value2"
}
}
""");
}
}
すべて単純なメソッドチェーンで記述できてめっちゃスッキリ🤩
【改善】DockerCompose利用時に起動・終了時引数を指定可能に
spring.docker.compose.start.arguments
とspring.docker.compose.stop.arguments
によってdocker composeの起動・終了時の引数の指定が可能になりました。
【新機能】SSLbundle利用時に証明書の情報をactuatorから取得可能に
以下のようにssl bundleを利用している場合、/actuator/health
で証明書の情報が取得可能になりました。
spring:
ssl:
bundle:
jks:
server:
key:
alias: "sample"
keystore:
location: classpath:ssl/keystore.p12
password: "sample"
type: "PKCS12"
# 証明書の情報を取得するために必要な設定
management:
endpoints:
web:
exposure:
include: info,health # infoを含める
endpoint:
info:
access: read-only
info:
ssl:
enabled: true
実際に取得できる情報はこちらです(証明書はローカルで適当に作ったものです。)
{
"ssl": {
"bundles": [
{
"name": "server",
"certificateChains": [
{
"alias": "sample",
"certificates": [
{
"subject": "O=Internet Widgits Pty Ltd,ST=Some-State,C=AU",
"version": "V3",
"issuer": "CN=testca,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU",
"validity": {
"status": "VALID"
},
"validityStarts": "2024-11-20T07:08:08Z",
"validityEnds": "2034-11-18T07:08:08Z",
"serialNumber": "696c6e874e7ba1415ca80779239b56740d77291f",
"signatureAlgorithmName": "SHA256withRSA"
}
]
}
]
}
]
}
}
アプリケーション自体の証明書はcurl等で叩けばわかりますが、内部で外部リソースと通信するときの証明書は見れなかったのでありがたい機能ですね 🤔
【新機能】ScheduledTaskの情報が取得可能に
/actuator/scheduledtasks
からScheduledTaskの情報が取得できるようになりました。
実際に取得してみたサンプルはこちら
{
"cron": [],
"fixedDelay": [],
"fixedRate": [
{
"runnable": {
"target": "hirabay.migration.scheduledtask.ScheduledTaskSample.sampleTask"
},
"initialDelay": 0,
"interval": 10000,
"lastExecution": {
"time": "2024-11-20T07:38:25.785525Z",
"status": "SUCCESS"
},
"nextExecution": {
"time": "2024-11-20T07:38:35.780875Z"
}
}
],
"custom": []
}
その他
Kubernetes環境で LivenessとReadiness エンドポイントがデフォルトで有効に
kubernetes環境と書きましたが、正しくは「Cloud Foundry Platforms」環境で/actuator/health/liveness
と /actuator/health/readiness
がデフォルトで有効になります。
もともと有効にしていなければ、kubernetesのマニフェストにも上記エンドポイントを設定していないはずなので既存影響とかはないはず