shiroの知恵袋

元SEのIT講師shiroが、プログラミングや趣味を語るブログです。

【Spring Boot 2.6 Release Notes】日本語訳

はじめに

昨年に続き、今年も仕事でSpring Boot 2.6 を利用することになりましたので、Release Notesを訳してみました。
<!!注意!!>
筆者は特に英語力に自信があるわけではありません。ご利用の際は自己責任でお願いいたします。

(参考:当ブログの免責事項

誤訳があればご指摘いただけると幸いです。本文は下記のリンクを参照しています。

github.com

以下、リリースノートの日本語訳です。

別バージョンの日本語訳へのリンク

Spring Boot 2.4

Spring Boot 2.6.0 リリースノート

Spring Boot 2.5からの変更点

Spring Boot 2.4からの非推奨

Spring Boot 2.4で非推奨だったクラス、メソッド、プロパティは本リリースで削除されました。 アップグレードする前に、廃止されたメソッドを呼び出していないことを確認してください。

循環参照がデフォルトで禁止

Bean間の循環参照がデフォルトで禁止されました。 BeanCurrentlyInCreationExceptionが原因でアプリケーションを起動できない場合は、依存関係のサイクルを断ち切るために構成を更新することを強く推奨します。

これができない場合は、 spring.main.allow-circular-referencestrueに設定するか、 SpringApplicationSpringApplicationBuilderの新しいセッターメソッドを使用することで、循環参照を再度許可できます。 これによって2.5の動作が復元され、依存関係のサイクルが自動的に中断されます。

Spring MVC向けPathPatternベースのパスマッチング戦略

登録されたSpring MVCハンドラマッピングに対してリクエストパスを照合するためのデフォルトの戦略が、AntPathMatcherからPathPatternParserに変更されました。

Spring Securityを使用している場合は、mvcMatchersの使用を確認して、Matcherが引き続きニーズを満たしていることを確認する必要があります。 AntPathMatcherを使用すると、authorizeRequests.mvcMatchers("hello").permitAll()/helloへのアクセスを許可します。 PathPatternParserをより正確に照合するには、代わりにauthorizeRequests.mvcMatchers("/hello").permitAll()(先頭の/に注意)を使用する必要があります。

デフォルトをAntPathMatcherに戻す必要がある場合は、spring.mvc.pathmatch.matching-strategyant-path-matcherに設定できます。

アクチュエータのエンドポイントも PathPatternベースのURLマッチングを使用するようになりました。 アクチュエータエンドポイントのパスマッチング戦略は、構成プロパティを介して構成できないことに注意してください。 アクチュエータとSpringfoxを使用している場合、アプリケーションの起動に失敗する可能性があります。 詳細については、この Springfox issue を参照してください。

アクチュエータ Env InfoContributor のデフォルト無効

env 情報contributor はデフォルトで無効になりました。 このcontributorは、名前が info で始まるSpring Environmentのプロパティを公開します。 infoで始まるプロパティがあり、それらをEnvironmentEndpointに表示したい場合は、 management.info.env.enabledtrueに設定します。

アプリケーションの起動

ApplicationStartupに記録されるspring.boot.application.running起動ステップは spring.boot.application.readyに名前が変更されました。 FlightRecorderApplicationStartupまたはBufferingApplicationStartupから生成されたファイルを処理している場合は、新しい名前を使用する必要があります。

Webリソースの構成

この構成はWebPropertiesで設定されているため、Resourcesを直接インジェクションすることはできなくなりました。 この情報にアクセスする必要がある場合は、代わりにWebPropertiesを挿入する必要があります。

依存関係管理の削除

JBoss Transaction SPI

org.jboss:jboss-transaction-spiの依存関係管理は削除されました。 org.jboss:jboss-transaction-spiを使用している場合は、アプリケーションのニーズを満たす独自の依存関係管理を定義する必要があります。

Nimbus DS

com.nimbusds:oauth2-oidc-sdkcom.nimbusds:nimbus-jose-jwtの依存関係管理は削除されました。 Spring Securityを使用している場合は、一時的な依存関係としてプルするバージョンに頼る必要があります。 Spring Securityを使用していない場合は、アプリケーションのニーズを満たす独自の依存関係管理を定義する必要があります。

HAL Browser

org.webjars:hal-browserの依存関係管理は削除されました。 org.webjars:hal-browserを使用している場合は、アプリケーションのニーズを満たす独自の依存関係管理を定義する必要があります。

Prometheusバージョンプロパティ

Prometheusのバージョンを制御するプロパティが prometheus-pushgateway.versionからprometheus-client.versionに変更されました。 これは、プロパティがプッシュゲートウェイだけでなく、Prometheusのクライアント内のすべてのモジュールのバージョンを管理しているという事実を反映するためです。

Embedded Mongo

Embedded Mongoを使用するには、spring.mongodb.embedded.versionプロパティを設定する必要があります。 これは、組み込みサポートで使用されるMongoDBバージョンが、アプリケーションが本番環境で使用するMongoDBバージョンと一致することを確認するのに役立ちます。

Oracle Database Driver の依存関係管理

Oracleデータベースドライバの依存関係管理が簡素化されました。 前述のとおり依存関係管理を削除したため、古い com.oracle.ojdbc groupIdに引き続き依存している場合は、com.oracle.database.jdbcグループにアップグレードする必要があります。

Vault関連のFlywayプロパティ削除

Flywayの7.12リリースは、Vault関連の設定をクローズドソースの拡張機能に移動しました。 残念ながら、これによりSpringBootがそれらを構成できなくなります。 結果として、対応する spring.flyway.vault-secretsspring.flyway.vault-token、および spring.flyway.vault-urlプロパティが削除されました。 Flyway Teamsユーザーの場合、設定は FlywayConfigurationCustomizer Bean、FluentConfigiguration.getExtensionConfiguration、およびVaultApiExtensionを介して構成できます。

WebFlux セッションプロパティ

spring.webflux.sessionプロパティグループは非推奨になり、server.reactive.sessionに再配置されました。 古いプロパティは引き続き機能しますが、可能であれば新しいプロパティに移行すべきです。

Elasticsearchプロパティの統合

Elasticsearchクライアントの構成に使用される構成プロパティが統合されました。 以前は、ブロッキング高レベルRESTクライアントとリアクティブRESTクライアントを構成するためのいくつかの一般的なプロパティが、 spring.elasticsearch.restspring.data.elasticsearch.clients.reactive間で重複していました。

ブロッキングRESTクライアントを使用している場合の、古いプロパティとその置き換えを次の表に示します:

Deprecated Property Replacement
spring.elasticsearch.rest.uris spring.elasticsearch.uris
spring.elasticsearch.rest.username spring.elasticsearch.username
spring.elasticsearch.rest.password spring.elasticsearch.password
spring.elasticsearch.rest.connection-timeout spring.elasticsearch.connection-timeout
spring.elasticsearch.rest.read-timeout spring.elasticsearch.socket-timeout
spring.elasticsearch.rest.sniffer.interval spring.elasticsearch.restclient.sniffer.interval
spring.elasticsearch.rest.sniffer.delay-after-failure spring.elasticsearch.restclient.sniffer.delay-after-failure

リアクティブRESTクライアントを使用している場合の、古いプロパティとその置き換えを次の表に示します:

Deprecated Property Replacement
spring.data.elasticsearch.client.reactive.endpoints spring.elasticsearch.uris
spring.data.elasticsearch.client.reactive.use-ssl https scheme when configuring spring.elasticsearch.uris
spring.data.elasticsearch.client.reactive.username spring.elasticsearch.username
spring.data.elasticsearch.client.reactive.password spring.elasticsearch.password
spring.data.elasticsearch.client.reactive.connection-timeout spring.elasticsearch.connection-timeout
spring.data.elasticsearch.client.reactive.socket-timeout spring.elasticsearch.socket-timeout
spring.data.elasticsearch.client.reactive.max-in-memory-size spring.elasticsearch.webclient.max-in-memory-size

@PersistentはSpring Data Couchbaseでは考慮されない

デフォルトの動作をSpring Data Couchbaseに合わせるために、@Persistentアノテーション付きの型は考慮されなくなりました。 そのアノテーションに依存している場合は、代わりに @Documentを使用できます。

Mavenビルド情報のデフォルト時間

Mavenプラグインのビルド情報サポートは、デフォルトのビルド時間としてproject.build.outputTimestampプロパティの値を使用するようになりました。 プロパティが設定されていない場合、ビルドセッションの開始時刻が以前と同じように使用されます。 以前と同様に、時刻を「オフ」に設定することで、時刻を完全に無効にすることができます。

レコードと @ConfigurationProperties

Java16のレコードで @ConfigurationPropertiesを使用していて、レコードに単一のコンストラクタがある場合、@ConstructorBindingアノテーションを付ける必要はなくなりました。 レコードに複数のコンストラクタがある場合、プロパティバインディングに使用するコンストラクタを識別するために、 @ConstructorBindingを使用する必要があります。

遅延OpenID Connect検出

OpenID Connectのissuer-uriで構成されたspring-security-oauth2-resource-serverを使用するリソースサーバーアプリケーションの場合、Spring Bootは NimbusJwtDecoderの代わりにSupplierJwtDecoderを自動構成するようになりました。 これにより、Spring Securityの遅延OIDC検出サポートが有効になり、起動時間が短縮されます。 同様に、リアクティブアプリケーションの場合、 ReactiveSupplierJwtDecoderが自動構成されます。

最小要件の変更

なし。

新規注目点

ヒント:構成の変更の完全な概要については、 構成変更ログ を確認してください。

SameSite Cookie属性サーブレットのサポート

server.servlet.session.cookie.same-siteプロパティを使用して、サーブレットアプリケーションのセッションCookieSameSite属性を設定できるようになりました。 これは、自動構成されたTomcat、Jetty、およびUndertowサーバーで機能します。

さらに、他のCookieSameSite属性を適用する場合は、CookieSameSiteSupplierインターフェースを使用できます。 詳細およびサンプルコードについては、updated documentation を参照してください。

リアクティブサーバーセッションのプロパティ

(以前は spring.webflux.sessionでサポートされていた)リアクティブサーバーでサポートされているセッションプロパティは、このリリースで拡張されました。 新しいプロパティは server.reactive.sessionで利用可能であり、サーブレットバージョンと同等の機能を提供するようになりました。

プラグ可能なサニタイズルール

Spring Bootは、/envおよび/configpropsエンドポイントに存在するセンシティブな値をサニタイズします。 構成プロパティを介してどのプロパティをサニタイズするかを構成することは可能でしたが、ユーザーは、プロパティがどの PropertySourceから発生したかに基づいてサニタイズルールを適用したい場合があります。 たとえば、Spring Cloud Vaultは、Vaultを使用して暗号化された値を保存し、Spring環境にロードします。 すべての値が暗号化されているため、プロパティソース全体のすべてのキーの値を空白にすることは理にかなっています。 このようなサニタイズのカスタマイズは、SanitizingFunction型の@Beanを追加することで構成できます。

Javaランタイム情報

次の例に示すように、infoエンドポイントはjavaキーの下でJavaランタイム情報を公開できるようになりました:

{
  "java": {
    "vendor": "BellSoft",
    "version": "17",
    "runtime": {
      "name": "OpenJDK Runtime Environment",
      "version": "17+35-LTS"
    },
    "jvm": {
      "name": "OpenJDK 64-Bit Server VM",
      "vendor": "BellSoft",
      "version": "17+35-LTS"
    }
  }
}

この情報を infoエンドポイントの応答で公開するには、management.info.java.enabledプロパティを trueに設定します。

ビルド情報プロパティの除外

Spring Boot MavenまたはGradleプラグインによって生成された build-info.propertiesファイルに追加される特定のプロパティを除外できるようになりました。

Mavenユーザーは、 <excludeInfoProperties>タグを使用して、標準の groupartifactnameversiontimeプロパティを除外できます。

たとえば、 versionプロパティを除外するには、次の構成を使用できます:

<configuration>
    <excludeInfoProperties>
        <excludeInfoProperty>version</excludeInfoProperty>
    </excludeInfoProperties>
</configuration>

Gradleユーザーは、DSLpropertiesブロックでnull値を使用できます:

task buildInfo(type: org.springframework.boot.gradle.tasks.buildinfo.BuildInfo) {
    destinationDir project.buildDir
    properties {
        version = null
    }
}

ヘルスサポート

メインポートまたは管理ポートの追加パス

ヘルスグループは、メインポートまたは管理ポートのいずれかの追加パスで使用できるようにすることができます。 これは、セキュリティの目的でアクチュエータエンドポイントに個別の管理ポートを使用することが非常に一般的であるKubernetesなどのクラウド環境で役立ちます。 別のポートがあると、ヘルスチェックが成功した場合でもメインアプリケーションが正しく機能しない可能性があるため、ヘルスチェックの信頼性が低下する可能性があります。 一般的な構成では、すべてのアクチュエータエンドポイントが別々のポートにあり、メインポートの追加パスで利用可能な活性と準備のために使用されるヘルスグループがあります。

複合コントリビュータサポートの包含/除外

ヘルスグループは、 CompositeHealthContributorの一部を包含/除外するように構成できます。 これは、コンポーネントへの完全修飾パスを指定することで実行できます。 たとえば、 testという名前のコンポジット内にネストされたコンポーネントspringは、 test/springを使用して含めることができます。

メトリクスのサポート

アプリケーションの起動

自動構成により、アプリケーションの起動に関連する2つのメトリクスが公開されます:

  • application.started.time:アプリケーションの起動にかかる時間。

  • application.ready.time:アプリケーションがリクエストを処理できるようになるまでにかかる時間。

ディスクスペース

Micrometerの DiskSpaceMetricsが自動構成されるようになりました。 disk.freeおよびdisk.totalメトリクスは、現在の作業ディレクトリによって識別されるパーティションに対して提供されます。 使用されるパスを変更するには、独自のDiskSpaceMetricsBeanを定義します。

タスクの実行とスケジューリング

Micrometerの ExecutorServiceMetricsは、基盤となるThreadPoolExecutorが使用可能である限り、すべての ThreadPoolTask​​ExecutorおよびThreadPoolTask​​SchedulerBeanに対して自動構成されるようになりました。 メトリクスは、Bean名から派生したエグゼキュータの名前でタグ付けされます。

Jetty コネクションと SSL

Micrometerの JettyConnectionMetricsが自動構成されるようになりました。 Additionally, when server.ssl.enabled is set to true, Micrometer’s JettySslHandshakeMetrics are also auto-configured. さらに、server.ssl.enabledtrueに設定されている場合、Micrometerの JettySslHandshakeMetricsも自動構成されます。

Dynatrace v2 APIへのエクスポート

Dynatrace v2 APIへのメトリクスのエクスポートのサポートが追加されました。 ホスト上でローカルOneAgentが実行されている場合、必要なのは io.micrometer:micrometer-registry-dynatraceへの依存だけです。 ローカルのOneAgentがない場合は、management.metrics.export.dynatrace.uriプロパティとmanagement.metrics.export.dynatrace.api-tokenプロパティを構成する必要があります。 v2 APIに固有のその他の設定は、management.metrics.export.dynatrace.v2プロパティを使用して構成できます。

詳細については、updated reference documentation を参照してください。

Dockerイメージ構築のサポート

追加イメージタグ

MavenおよびGradleプラグインは、 tags構成パラメータを使用してビルドされた後、生成されたイメージに追加のタグを適用することをサポートするようになりました。

詳細については、更新された GradleMaven のリファレンスドキュメントを参照してください。

ネットワーク構成

Mavenプラグインspring-boot:build-imageゴールとGradlebootBuildImageタスクにnetwork構成パラメータが追加されました。 このパラメータを使用して、Cloud Native Buildpacks Builderプロセスを実行するコンテナが使用するネットワークドライバを構成できます。

キャッシュ構成

MavenおよびGradleプラグインは、 buildCacheおよびlaunchCache構成パラメータを使用して、ビルドパックによってビルドされたイメージに提供されるレイヤーをキャッシュするために使用されるボリュームの名前のカスタマイズをサポートするようになりました。

詳細については、更新された GradleMaven のリファレンスドキュメントを参照してください。

Spring Data Enversの自動構成

Spring Data Enversの自動構成が提供されるようになりました。 To use it, add a dependency on org.springframework.data:spring-data-envers and update your JPA repositories to extend from RevisionRepository. これを使用するには、org.springframework.data:spring-data-enversへの依存関係を追加し、JPAリポジトリRevisionRepositoryから拡張するように更新します。

Redisコネクションプール

commons-pool2がクラスパス上にある場合、Redis(JedisとLettuceの両方)が自動的にプーリングを有効にするようになりました。 必要に応じて、spring.redis.jedis.pool.enabledまたはspring.redis.lettuce.pool.enabledfalseに設定してプーリングを無効にしてください。

spring-rabbit-streamの自動設定

Spring AMQPの新しい spring-rabbit-streamモジュールの自動構成が追加されました。 spring.rabbitmq.listener.typeプロパティがstreamに設定されている場合、 StreamListenerContainerは自動構成されます。 spring.rabbitmq.stream.*プロパティを使用してブローカーへのアクセスを構成し、 spring.rabbitmq.listener.stream.native-listenerを使用してネイティブリスナーのサポートを有効にすることができます。

Kafka SSLプロパティでのPEM形式のサポート

以前は、KafkaはSSLのファイルベースのキーストアとトラストストアのみをサポートしていました。 KIP-651で、 PEM形式を使用できるようになりました。

Spring Bootは、PEM形式を使用してSSL証明書秘密鍵を構成できるようにする次のプロパティを追加しました:

  • spring.kafka.ssl.key-store-key
  • spring.kafka.ssl.key-store-certificate-chain
  • spring.kafka.ssl.trust-store-certificates

MavenプラグインstartGoalの構成の改善

MavenプラグインstartGoalはコマンドラインから、より構成しやすくなりました。 そのwaitプロパティとmaxAttemptsプロパティは、それぞれ spring-boot.start.waitspring-boot.start.maxAttemptsを使用して指定できます。

自動構成されたSpring Webサービスサーバーのテスト

Webサービス@EndpointBeanをテストするために使用できる新しいアノテーション@WebServiceServerTestが導入されました。 このアノテーションは、@EndpointBeanを含むテストスライスを作成し、Webサービスエンドポイントのテストに使用できるMockWebServiceClientBeanを自動構成します。

Bean ValidationメッセージのMessageSourceベースの補間

アプリケーションのMessageSourceは、制約メッセージの{parameters}を解決するときに使用されるようになりました。 これにより、アプリケーションのmessages.propertiesファイルをBean Validationメッセージに使用できます。 パラメータが解決されると、Bean Validationのデフォルトの補間器を使用してメッセージの補間が完了します。

Spring MVCをテストするためのWebTestClientの使用

開発者はWebTestClientを使用して、モック環境でWebFluxアプリをテストしたり、ライブサーバーに対して任意のSpring Webアプリをテストしたりできます。 この変更により、モック環境でSpring MVCWebTestClientも有効になります: @AutoConfigureMockMvcアノテーションが付けられたクラスにWebTestClientがインジェクションできます。

これでサポートが完了し、単一のAPIを使用してすべてのWebテストを実行できるようになりました!

Spring Integration PollerMetadata プロパティ

Spring Integration PollerMetadata(毎秒無制限の数のメッセージをポーリングする)をspring.integration.poller.*構成プロパティでカスタマイズできるようになりました。

Log4j2の複合構成のサポート

Log4j2の複合構成がサポートされるようになりました。 これを使用するには、メイン構成をオーバーライドするセカンダリ構成ファイルのコンマ区切りリストを使用して、logging.log4j2.config.overrideプロパティを構成します。 主な構成は、Spring Bootのデフォルト、log4j2.xmlなどのよく知られた標準の場所、または以前のようにlogging.configプロパティで指定された場所から供給されます。

依存関係のアップグレード

Spring Boot 2.6は、いくつかのSpringプロジェクトの新しいバージョンに移行します:

多数のサードパーティの依存関係も更新されましたが、その中でも注目すべきものは次のとおりです:

その他

上記の変更とは別に、次のような多くのマイナーな調整と改善も含みます:

  • NoSuchMethodErrorの失敗分析には、呼び出し元のクラスがロードされた場所に関する情報が含まれるようになりました。

  • ClientResourcesBuilderCustomizer Beanを定義して、LettuceのClientResourcesがデフォルトの自動構成を保持するようにカスタマイズできるようになりました。

  • FlywayのdetectEncodingfailOnMissingLocations、および ignoreMigrationPatterns構成設定の構成プロパティが追加されました。

  • SpringApplicationBulderを作成するときに、アプリケーションで使用されるカスタムのResourceLoaderを提供できます。

  • WebSessionIdResolverを定義して、自動構成されたWebSessionManagerによって使用されるリゾルバをカスタマイズできるようになりました。

  • RSocketConnectorConfigurer Beanは、自動構成されたRSocketRequester.Builderに自動的に適用されるようになりました。

  • spring-boot-configuration-processorは、Lombok@Valueアノテーションが付けられたクラスのメタデータを生成できるようになりました。

  • 新しいserver.tomcat.reject-illegal-header構成プロパティをtrueに設定して、Tomcatが不正なヘッダーを受け入れるように構成できます。

  • Stackdriverを使用する場合、management.metrics.export.stackdriver.resource-labels.*構成​​プロパティを設定することにより、モニターリソースでラベルを構成できるようになりました。

  • @EntityScanは、basePackages属性でコンマ区切りの値をサポートするようになりました。

  • Reactor Nettyのアイドルタイムアウトを制御するために使用できる新しい構成プロパティserver.netty.idle-timeoutが追加されました。

  • Devtoolsがグローバル設定をロードする場所は、spring.devtools.homeシステムプロパティまたはSPRING_DEVTOOLS_HOME環境変数を使用して構成できるようになりました。

  • RabbitTemplateConfigurerのsetterメソッドはpublicになりました。

  • heapdumpエンドポイントがOpenJ9でサポートされるようになり、PHD形式でヒープダンプが生成されます。

  • 新しい構成プロパティが、WebFluxのspring.webflux.multipart.*でのマルチパートサポートでサポートされるようになりました。

  • 自動構成されたSpring AMQPMessageListenerContainerを構成するために、任意のContainerCustomizerBeanが呼び出されるようになりました。

  • Jacksonのデフォルトのleniencyは、spring.jackson.default-leniencyプロパティを使用して構成できます。

  • 分布統計の有効期限とバッファ長を構成できるようになりました。

  • Lettuceのコマンドレイテンシメメトリクスが自動構成されるようになりました。

  • ディスクスペースメトリクスは、management.metrics.system.diskspace.pathsプロパティを使用して1つ以上のパスで構成できます。

  • ユーザーは、RedisStandaloneConfiguration Beanを提供することで、Redisの自動構成を制御できます。

  • H2コンソールが自動構成されたときに、使用可能なすべてのデータソースのURLがログに記録されるようになりました。

  • 新しい構成プロパティspring.integration.management.default-logging-enabledを使用して、値をfalseに設定することにより、Spring Integrationのデフォルトのログを無効にすることができます。

  • AuthenticationManagerProviderBeanが存在する場合、UserDetailsS​​erviceの自動構成はバックオフするようになりました。

Spring Boot 2.6.0 での非推奨

  • AbstractDataSourceInitializerは廃止され、DataSourceScriptDatabaseInitializerが採用されました。 同様に、AbstractDataSourceInitializerのサブクラスは廃止され、新しいDataSourceScriptDatabaseInitializerベースの同等のものが採用されました。

  • SpringPhysicalNamingStrategyは廃止され、Hibernate 5.5のCamelCaseToUnderscoresNamingStrategyが採用されました。

  • AbstractApplicationContextRunnerの3つのメソッドは非推奨になり、新しいRunnerConfigurationベースの同等のメソッドが採用されました。

  • SpringApplicationRunListenerstartedメソッドとrunningメソッドは、Durationを受け入れるバージョンに置き換えられました。

  • ApplicationStartedEventApplicationReadyEventのコンストラクタは、Durationを受け入れるバージョンに置き換えられました。

  • EnvironmentEndpoint.sanitizeは今後の削除のために非推奨になりました。