【バグ記録】Spring Securityの設定クラスで循環参照エラーが発生する場合の対処方法
現象
Spring Boot 2.6にアップデートした際、アプリ起動時にSecurityConfigで下記のエラーが発生する。
Description: The dependencies of some of the beans in the application context form a cycle:
┌──->──┐
| securityConfig
└──<-──┘
原因
SecurityConfigにおいて、configureGlobalメソッドで使用する自身のBeanを@Autowiredしようとしていることが原因で循環参照が発生している。
※Spring Boot 2.6以上では循環参照がデフォルトで禁止されている。
(SecurityConfig.java)
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 省略 } @Autowired // !!ここが原因!! public void configureGlobal( AuthenticationManagerBuilder auth, UserDetailsServiceImpl userDetailsService, PasswordEncoder passwordEncoder) throws Exception { auth.eraseCredentials(true).userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
解決方法
① configureGlobalを別クラスにする
(SecurityConfig.java)
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 省略 } @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
(GlobalConfiguration.java)
@Configuration @EnableWebSecurity public class GlobalConfiguration { @Autowired public void configureGlobal( AuthenticationManagerBuilder auth, UserDetailsServiceImpl userDetailsService, PasswordEncoder passwordEncoder) throws Exception { auth.eraseCredentials(true).userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } }
② @Lazyアノテーションを付与する
@Lazy
アノテーションで遅延初期化をさせます。
@Lazy
が付与された@Bean
または @Component
は、別の Bean によって参照されるか、それを囲む BeanFactory から明示的に取得されるまで初期化されません。
リファレンス: Lazy (Spring Framework API) - Javadoc
(SecurityConfig.java)
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 省略 } @Autowired @Lazy // 追加 public void configureGlobal( AuthenticationManagerBuilder auth, UserDetailsServiceImpl userDetailsService, PasswordEncoder passwordEncoder) throws Exception { auth.eraseCredentials(true).userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } @Bean PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
【Spring Boot 2.6 Release Notes】日本語訳
- はじめに
- 別バージョンの日本語訳へのリンク
- Spring Boot 2.6.0 リリースノート
- Spring Boot 2.5からの変更点
- Spring Boot 2.4からの非推奨
- 循環参照がデフォルトで禁止
- Spring MVC向けPathPatternベースのパスマッチング戦略
- アクチュエータ Env InfoContributor のデフォルト無効
- アプリケーションの起動
- Webリソースの構成
- 依存関係管理の削除
- Prometheusバージョンプロパティ
- Embedded Mongo
- Oracle Database Driver の依存関係管理
- Vault関連のFlywayプロパティ削除
- WebFlux セッションプロパティ
- Elasticsearchプロパティの統合
- @PersistentはSpring Data Couchbaseでは考慮されない
- Mavenビルド情報のデフォルト時間
- レコードと @ConfigurationProperties
- 遅延OpenID Connect検出
- 最小要件の変更
- 新規注目点
- SameSite Cookie属性サーブレットのサポート
- リアクティブサーバーセッションのプロパティ
- プラグ可能なサニタイズルール
- Javaランタイム情報
- ビルド情報プロパティの除外
- ヘルスサポート
- 複合コントリビュータサポートの包含/除外
- メトリクスのサポート
- Dockerイメージ構築のサポート
- Spring Data Enversの自動構成
- Redisコネクションプール
- spring-rabbit-streamの自動設定
- Kafka SSLプロパティでのPEM形式のサポート
- MavenプラグインのstartGoalの構成の改善
- 自動構成されたSpring Webサービスサーバーのテスト
- Bean ValidationメッセージのMessageSourceベースの補間
- Spring MVCをテストするためのWebTestClientの使用
- Spring Integration PollerMetadata プロパティ
- Log4j2の複合構成のサポート
- 依存関係のアップグレード
- その他
- Spring Boot 2.6.0 での非推奨
- Spring Boot 2.5からの変更点
はじめに
昨年に続き、今年も仕事でSpring Boot 2.6 を利用することになりましたので、Release Notesを訳してみました。
<!!注意!!>
筆者は特に英語力に自信があるわけではありません。ご利用の際は自己責任でお願いいたします。
(参考:当ブログの免責事項)
誤訳があればご指摘いただけると幸いです。本文は下記のリンクを参照しています。
以下、リリースノートの日本語訳です。
別バージョンの日本語訳へのリンク
Spring Boot 2.6.0 リリースノート
Spring Boot 2.5からの変更点
Spring Boot 2.4からの非推奨
Spring Boot 2.4で非推奨だったクラス、メソッド、プロパティは本リリースで削除されました。 アップグレードする前に、廃止されたメソッドを呼び出していないことを確認してください。
循環参照がデフォルトで禁止
Bean間の循環参照がデフォルトで禁止されました。
BeanCurrentlyInCreationException
が原因でアプリケーションを起動できない場合は、依存関係のサイクルを断ち切るために構成を更新することを強く推奨します。
これができない場合は、 spring.main.allow-circular-references
をtrue
に設定するか、 SpringApplication
とSpringApplicationBuilder
の新しいセッターメソッドを使用することで、循環参照を再度許可できます。
これによって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-strategy
をant-path-matcher
に設定できます。
アクチュエータのエンドポイントも PathPattern
ベースのURLマッチングを使用するようになりました。
アクチュエータエンドポイントのパスマッチング戦略は、構成プロパティを介して構成できないことに注意してください。
アクチュエータとSpringfoxを使用している場合、アプリケーションの起動に失敗する可能性があります。
詳細については、この Springfox issue を参照してください。
アクチュエータ Env InfoContributor のデフォルト無効
env
情報contributor はデフォルトで無効になりました。
このcontributorは、名前が info
で始まるSpring Environmentのプロパティを公開します。
info
で始まるプロパティがあり、それらをEnvironmentEndpoint
に表示したい場合は、 management.info.env.enabled
をtrue
に設定します。
アプリケーションの起動
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-sdk
とcom.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-secrets
、spring.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.rest
とspring.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
プロパティを使用して、サーブレットアプリケーションのセッションCookieにSameSite
属性を設定できるようになりました。
これは、自動構成されたTomcat、Jetty、およびUndertowサーバーで機能します。
さらに、他のCookieに SameSite
属性を適用する場合は、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>
タグを使用して、標準の group
、artifact
、 name
、version
、time
プロパティを除外できます。
たとえば、 version
プロパティを除外するには、次の構成を使用できます:
<configuration> <excludeInfoProperties> <excludeInfoProperty>version</excludeInfoProperty> </excludeInfoProperties> </configuration>
Gradleユーザーは、DSLの properties
ブロックで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
メトリクスは、現在の作業ディレクトリによって識別されるパーティションに対して提供されます。
使用されるパスを変更するには、独自のDiskSpaceMetrics
Beanを定義します。
タスクの実行とスケジューリング
Micrometerの ExecutorServiceMetrics
は、基盤となるThreadPoolExecutor
が使用可能である限り、すべての ThreadPoolTaskExecutor
およびThreadPoolTaskScheduler
Beanに対して自動構成されるようになりました。
メトリクスは、Bean名から派生したエグゼキュータの名前でタグ付けされます。
Jetty コネクションと SSL
Micrometerの JettyConnectionMetrics
が自動構成されるようになりました。
Additionally, when server.ssl.enabled
is set to true
, Micrometer’s JettySslHandshakeMetrics
are also auto-configured.
さらに、server.ssl.enabled
がtrue
に設定されている場合、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
構成パラメータを使用してビルドされた後、生成されたイメージに追加のタグを適用することをサポートするようになりました。
詳細については、更新された Gradle と Maven のリファレンスドキュメントを参照してください。
ネットワーク構成
Mavenプラグインの spring-boot:build-image
ゴールとGradlebootBuildImage
タスクにnetwork
構成パラメータが追加されました。
このパラメータを使用して、Cloud Native Buildpacks Builderプロセスを実行するコンテナが使用するネットワークドライバを構成できます。
キャッシュ構成
MavenおよびGradleプラグインは、 buildCache
およびlaunchCache
構成パラメータを使用して、ビルドパックによってビルドされたイメージに提供されるレイヤーをキャッシュするために使用されるボリュームの名前のカスタマイズをサポートするようになりました。
詳細については、更新された Gradle と Maven のリファレンスドキュメントを参照してください。
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.enabled
をfalse
に設定してプーリングを無効にしてください。
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プラグインのstart
Goalの構成の改善
Mavenプラグインのstart
Goalはコマンドラインから、より構成しやすくなりました。
そのwait
プロパティとmaxAttempts
プロパティは、それぞれ spring-boot.start.wait
とspring-boot.start.maxAttempts
を使用して指定できます。
自動構成されたSpring Webサービスサーバーのテスト
Webサービスの @Endpoint
Beanをテストするために使用できる新しいアノテーション@WebServiceServerTest
が導入されました。
このアノテーションは、@Endpoint
Beanを含むテストスライスを作成し、Webサービスエンドポイントのテストに使用できるMockWebServiceClient
Beanを自動構成します。
Bean ValidationメッセージのMessageSourceベースの補間
アプリケーションのMessageSource
は、制約メッセージの{parameters}
を解決するときに使用されるようになりました。
これにより、アプリケーションのmessages.properties
ファイルをBean Validationメッセージに使用できます。
パラメータが解決されると、Bean Validationのデフォルトの補間器を使用してメッセージの補間が完了します。
Spring MVCをテストするためのWebTestClientの使用
開発者はWebTestClient
を使用して、モック環境でWebFluxアプリをテストしたり、ライブサーバーに対して任意のSpring Webアプリをテストしたりできます。
この変更により、モック環境でSpring MVCの WebTestClient
も有効になります:
@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プロジェクトの新しいバージョンに移行します:
- Spring Security 5.6
- Spring Data 2021.1
- Spring HATEOAS 1.4
- Spring Kafka 2.8
- Spring AMQP 2.4
- Spring Session 2021.1.0
多数のサードパーティの依存関係も更新されましたが、その中でも注目すべきものは次のとおりです:
- Apache Kafka 3.0
- Artemis 2.19
- Cassandra Driver 4.13
- Commons DBCP 2.9
- Commons Pool 2.11
- Couchbase Client 3.2.2
- Elasticsearch 7.15
- Flyway 8.0.5
- Hibernate 5.6
- JUnit Jupiter 5.8
- Jedis 3.7
- Kafka 3.0
- Kotlin 1.6
- Liquibase 4.5
- Micrometer 1.8
- Mockito 4.0
- MongoDB 4.4
- Postgresql 42.3
- QueryDSL 5.0
- SnakeYAML 1.29
- Thymeleaf Layout Dialect 3.0
その他
上記の変更とは別に、次のような多くのマイナーな調整と改善も含みます:
NoSuchMethodError
の失敗分析には、呼び出し元のクラスがロードされた場所に関する情報が含まれるようになりました。ClientResourcesBuilderCustomizer
Beanを定義して、LettuceのClientResources
がデフォルトの自動構成を保持するようにカスタマイズできるようになりました。Flywayの
detectEncoding
、failOnMissingLocations
、および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 AMQP
MessageListenerContainer
を構成するために、任意のContainerCustomizer
Beanが呼び出されるようになりました。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のデフォルトのログを無効にすることができます。AuthenticationManagerProvider
Beanが存在する場合、UserDetailsService
の自動構成はバックオフするようになりました。
Spring Boot 2.6.0 での非推奨
AbstractDataSourceInitializer
は廃止され、DataSourceScriptDatabaseInitializer
が採用されました。 同様に、AbstractDataSourceInitializer
のサブクラスは廃止され、新しいDataSourceScriptDatabaseInitializer
ベースの同等のものが採用されました。SpringPhysicalNamingStrategy
は廃止され、Hibernate 5.5のCamelCaseToUnderscoresNamingStrategy
が採用されました。AbstractApplicationContextRunner
の3つのメソッドは非推奨になり、新しいRunnerConfiguration
ベースの同等のメソッドが採用されました。SpringApplicationRunListener
のstarted
メソッドとrunning
メソッドは、Duration
を受け入れるバージョンに置き換えられました。ApplicationStartedEvent
とApplicationReadyEvent
のコンストラクタは、Duration
を受け入れるバージョンに置き換えられました。EnvironmentEndpoint.sanitize
は今後の削除のために非推奨になりました。
AsciiDocのテーブル内にPlantUMLの図を埋め込む方法
やりたいこと
Asciidocのテーブル内にPlantUMLを埋め込みたい。
方法
具体例
AsciiDocコード
|=== |継承|実装 a|[plantuml, extends.svg, svg] .... abstract class Parent Parent <\|-- Child1 Parent <\|-- Child2 .... a|[plantuml, implements.svg, svg] .... interface Parent Parent <\|.. Child1 Parent <\|.. Child2 .... |===
結果
【Spring Boot 2.4 Release Notes】日本語訳
- はじめに
- Spring Boot 2.4リリースノート
- Spring Boot 2.3からの変更点
- バージョンスキーマ変更
- spring-boot-starter-testからJUnit 5のVintage Engineを削除
- 構成ファイルの処理(アプリケーションのプロパティとYAMLファイル)
- 構成データのインポート
- 組み込みデータベースの検出
- ログバック構成のプロパティ
- デフォルトサーブレット登録
- HTTPトレースにデフォルトでCookieヘッダが含まれない
- 転送のUndertowパス
- Neo4j
- Elasticsearch RestClient
- R2DBC
- Flyway
- Flatten Mavenプラグインのプラグイン管理の削除
- exec-maven-pluginのバージョン管理
- Spring Boot Gradleプラグイン
- 統合テストでのメトリクスのエクスポート
- Spring Boot 2.2および2.3からの非推奨
- 新規注目点
- Spring Framework 5.3
- Spring Data 2020.0
- Neo4j
- R2DBC
- Java 15サポート
- カスタムプロパティ名のサポート
- 階層化jarがデフォルトで有効
- 追加アプリケーション構成のインポート
- ボリュームマウントされた構成ディレクトリツリー
- ファイル拡張子のない設定ファイルのインポート
- オリジンチェーン
- スタートアップエンドポイント
- Docker/Buildpackのサポート
- Mavenビルドパックのサポート
- Gradleビルドパックのサポート
- Redisキャッシュメトリクス
- Web構成のプロパティ
- サーブレットとフィルタを登録可能な@WebListeners登録
- Cassandraスライステスト
- Flyway 7
- H2コンソールのWeb管理者パスワードの構成プロパティ
- ApacheCassandraのCqlSessionベースのヘルスインジケータ
- Prometheusによるフィルタースクレイピング
- Spring Security SAML構成プロパティ
- Failure Analyzers
- Jar最適化
- その他
- 依存関係のアップグレード
- Spring Boot2.4での非推奨
- Spring Boot 2.3からの変更点
はじめに
仕事でSpring Boot 2.4 を利用することになりましたので、Release Notesを訳してみました。
<!!注意!!>
筆者は特に英語力に自信があるわけではありません。ご利用の際は自己責任でお願いいたします。
(参考:当ブログの免責事項)
誤訳があればご指摘いただけると幸いです。本文は下記のリンクを参照しています。
以下、リリースノートの日本語訳です。
Spring Boot 2.4リリースノート
Spring Boot 2.3からの変更点
バージョンスキーマ変更
2.4として、Spring Bootは新Springバージョンスキーマに対応しています。(build.gradle/pom.xml
のSpring Bootバージョンを2.3.5.RELEASE
から2.4.0
に更新する必要があります。)
spring-boot-starter-test
からJUnit 5のVintage Engineを削除
Spring Boot 2.4にアップグレードしてorg.junit.Test
のようなJUnitクラスのテストコンパイルエラーが表示される場合、JUnit 5のvintage engineはspring-boot-starter-test
から削除されたことが原因である可能性があります。
Vintage Engineを使用すれば、JUnit4で記述されたテストをJUnit5で実行できます。テストをJUnit5に移行せず、引き続きJUnit 4を使用する場合は、次の例に示すようにVintageEngineへの依存関係を追加します。
Mavenの例:
<dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </exclusion> </exclusions> </dependency>
Gradleの例:
testImplementation("org.junit.vintage:junit-vintage-engine") { exclude group: "org.hamcrest", module: "hamcrest-core" }
構成ファイルの処理(アプリケーションのプロパティとYAMLファイル)
Spring Boot 2.4は、application.properties
ファイルとapplication.yml
ファイルの処理方法を変更しました。
単純なapplication.properties
またはapplication.yml
ファイルしかない場合、アップグレードはシームレスである必要があります。
ただし、より複雑な設定(プロファイル固有のプロパティまたはプロファイルアクティベーションプロパティの使用)がある場合、新しい機能を使用するにはいくつかの変更が必要になることがあります。
Spring Boot 2.3互換のロジックが必要な場合は、application.properties
またはapplication.yml
ファイルでspring.config.use-legacy-processing
プロパティをtrue
に設定できます。
構成データのインポート
spring.config.location
およびspring.config.import
(このリリースで導入)で指定された構成の場所は、ファイルまたはフォルダーが存在しない場合に暗黙で失敗しません。
場所をインポートしたいが、場所が見つからなくてもスキップしてかまわない場合は、optional:
プレフィックスを付ける必要があります。
例えば、spring.config.location=optional:/etc/config/application.properties
は、application.properties
ファイルが存在する場合は/etc/config/
からインポートし、存在しない場合はスキップします。
すべての場所をオプションとして扱いたい場合は、SpringApplication.setDefaultProperties(…)
またはシステム環境変数でspring.config.on-not-found=ignore
を設定できます。
組み込みデータベースの検出
組み込みデータベースロジックは、データベースがメモリ内にある場合にのみ組み込みと見なされるように改良されました。 H2、HSQL、Derbyでファイルベースの永続性またはサーバーモードを使用している場合、この変更は2つの結果をもたらします:
sa
ユーザ名は設定されなくなります。その動作に依存している場合は、構成でspring.datasource.username=sa
を設定する必要があります。- このようなデータベースは組み込みとは見なされなくなるため、起動時に初期化されなくなります。
spring.datasource.initialization-mode
を使用すると、これを通常として設定できます。
ログバック構成のプロパティ
ログバックに固有のログプロパティは、ログバック固有であるという事実を反映して名前が変更されました。以前の名前は非推奨になりました。
以下のSpring Bootプロパティが変更されました:
logging.pattern.rolling-file-name
→logging.logback.rollingpolicy.file-name-pattern
logging.file.clean-history-on-start
→logging.logback.rollingpolicy.clean-history-on-start
logging.file.max-size
→logging.logback.rollingpolicy.max-file-size
logging.file.total-size-cap
→logging.logback.rollingpolicy.total-size-cap
logging.file.max-history
→logging.logback.rollingpolicy.max-history
それらがマップするシステム環境プロパティも同様です:
ROLLING_FILE_NAME_PATTERN
→LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN
LOG_FILE_CLEAN_HISTORY_ON_START
→LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START
LOG_FILE_MAX_SIZE
→LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE
LOG_FILE_TOTAL_SIZE_CAP
→LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP
LOG_FILE_MAX_HISTORY
→LOGBACK_ROLLINGPOLICY_MAX_HISTORY
デフォルトサーブレット登録
Spring Boot 2.4は、サーブレットコンテナによって提供されるDefaultServlet
を登録しなくなります。
ほとんどのアプリケーションでは、Spring MVCのDispatcherServlet
が必要な唯一のサーブレットであるため使用されません。
デフォルトのサーブレットがまだ必要な場合は、server.servlet.register-default-servlet
をtrue
に設定できます。
HTTPトレースにデフォルトでCookieヘッダが含まれない
CookieリクエストヘッダとSet-Cookieレスポンスヘッダは、デフォルトでHTTPトレースに含まれなくなりました。
Spring Boot 2.3の動作を復元するには、cookies, errors, request-headers, response-headers
にmanagement.trace.http.include
を設定します。
転送のUndertowパス
デフォルトでは、Undertowはリクエストが転送されるときに元のリクエストURLを保持します。
このリリースは、サーブレット仕様に準拠するためにUndertowのデフォルトをオーバーライドします。
以前のUndertowのデフォルトの動作は、プロパティserver.undertow.preserve-path-on-forward
をtrue
に設定することで復元できます。
Neo4j
このリリースでは、Neo4jサポートが大幅に見直されています。
spring.data.neo4j.*
の多くのプロパティが削除され、Neo4jOGMのサポートも同様に削除されました。
Neo4jドライバの構成はspring.neo4j.*
名前空間を通して行われますが、データ名前空間からのURIと基本認証は非推奨の方法で引き続きサポートされています。
この変更とSpringData Neo4j 6の機能の詳細については、ドキュメントを確認してください。
Elasticsearch RestClient
低レベルのElasticsearch RestClient
Beanは、Spring Bootによって自動構成されなくなります。RestHighLevelClient
Beanは引き続き自動構成されます。
ほとんどのユーザは低レベルのクライアントを使用する必要はなく、この変更の影響を受けないはずです。
R2DBC
R2DBCのコアインフラは、新しいspring-r2dbc
モジュールを備えたSpringフレームワークに移行しました。
このインフラを使用している場合は、非推奨のアクセスを新しいコアサポートに移行してください。
Flyway
Flyway 7へのアップグレードには、コールバックの順序に対するいくつかの変更が含まれています。
これは、@Order
およびOrdered
を介してサポートする登録注文に依存しているすべての人にとって重大な変更になります。
Flyway 5を使用している場合、Flywayは1つの機能リリースのスキーマアップグレードのみを保持するため、Spring Boot2.4にアップグレードする前に必ずFlyway6にアップグレードしてください。
Flatten Mavenプラグインのプラグイン管理の削除
Spring BootのビルドはFlatten Mavenプラグイン(flatten-maven-plugin
)を使用しなくなり、プラグイン管理は削除されました。
Spring Bootの管理バージョンに依存している場合は、独自のプラグイン管理を追加する必要があります。
exec-maven-plugin
のバージョン管理
exec-maven-plugin
のバージョン管理は削除されました。
このプラグインを使用している場合は、独自のpluginManagement
でバージョンを指定してください。
Spring Boot Gradleプラグイン
Spring Boot GradleプラグインのbootJar
タスクのDSLが更新され、Property<String>
を使用してmainClass
を構成できるようになりました。現在mainClassName
を使用している場合、例えば:
bootJar { mainClassName 'com.example.ExampleApplication' }
それを`mainClass'に変更する必要があります:
bootJar { mainClass 'com.example.ExampleApplication' }
統合テストでのメトリクスのエクスポート
@SpringBootTest
は利用可能な監視システムを構成しなくなり、メモリ内のMeterRegistry
のみを提供します。
統合テストの一部としてメトリックをエクスポートしていた場合は、テストに @AutoConfigureMetrics
を追加して、以前の動作を復元できます。
Spring Boot 2.2および2.3からの非推奨
Spring BootのRelease Compatibilityポリシーを反映して、Spring Boot 2.2で非推奨となったコードはSpring Boot 2.4で削除されました。 Spring Boot 2.3で非推奨になったコードはそのまま残り、Spring Boot 2.5で削除される予定です。
新規注目点
構成の変更の完全な概要については、構成の変更ログを確認してください。
Spring Framework 5.3
Spring Boot 2.4はSpring Framework 5.3を使用します。 Spring Framework wikiには、新しいリリースの詳細が記載された新機能のセクションがあります。
Spring Data 2020.0
Spring Boot 2.4には、Spring Dataリリーストレインのバージョン2020.0(コードネームOckham)が含まれています。リリースの詳細については、Spring Data wikiを参照してください。
Neo4j
このリリースでは、リアクティブリポジトリがサポートされ、Neo4jドライバの個別の自動構成に依存しています。その結果、SpringDataの有無にかかわらずNeo4jを使用できるようになりました。
Neo4jのヘルスチェックはドライバを使用し、Neo4jドライバが構成されている限り利用できます。
リアクティブアクセスで @Transactional
を使用する場合は、今のところ、Neo4jReactiveTransactionManager
Beanを自分で構成する必要があります。
@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME) public ReactiveTransactionManager reactiveTransactionManager(Driver driver, ReactiveDatabaseSelectionProvider databaseNameProvider) { return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider); }
R2DBC
R2dbcEntityTemplate
を使用して、エンティティを通してリアクティブR2DBCの使用を簡素化できます。
Java 15サポート
Spring Boot 2.4は、Java 15を完全にサポートするようになりました。サポートされる最小バージョンはJava 8のままです。
カスタムプロパティ名のサポート
コンストラクタバインディングを使用する場合、プロパティの名前はパラメータ名から派生します。 これは、Javaの予約済みキーワードを使用する場合に問題になる可能性があります。
このような状況では、次のような@Name
アノテーションを使用できるようになりました。
@ConfigurationProperties(prefix = "sample") @ConstructorBinding public class SampleConfigurationProperties { private final String importValue; public SampleConfigurationProperties(@Name("import") String importValue) { this.importValue = importValue; } }
上記のサンプルは、sample.import
プロパティを公開しています。
階層化jarがデフォルトで有効
このリリースでは、階層化jarが有効になり、デフォルトでlayertoolsが含まれています。 これによって、すぐに使用できるビルドパックを使用して生成されたイメージの効率が向上し、カスタムDockerfileを作成するときにその機能を利用できるようになります。
追加アプリケーション構成のインポート
spring.config.use-legacy-processing
をtrue
に設定していない限り、メインのapplication.properties
またはapplication.yml
から直接追加プロパティとyamlファイルをインポートできるようになりました。
spring.config.import
プロパティを使用して、Spring環境にインポートする必要がある1つ以上の追加の構成ファイルを指定できます。詳細については、リファレンスガイドのこのセクションを参照してください。
これらの変更を行った理由を説明するショートブログを公開しました。
ボリュームマウントされた構成ディレクトリツリー
spring.config.import
プロパティを使用して、Kubernetesで一般的に使用される構成ツリーをインポートすることもできます。
構成ツリーは、キー/値のペアを提供する別の方法です。
各ペアは独自のファイルで宣言され、ファイル名がプロパティキーを形成し、ファイルの内容が値を提供します。
完全な例については、更新されたリファレンスドキュメントを参照してください。
構成ツリーからロードされたプロパティには、デフォルトで末尾の改行文字がトリミングされています。
ファイル拡張子のない設定ファイルのインポート
一部のクラウドプラットフォームでは、ファイル拡張子なしでファイルをボリュームマウントすることしかできません。
このような制約がある場合は、コンテンツタイプに関するヒントをSpring Bootに提供することで、これらのファイルをインポートできるようになりました。
例えば、spring.config.import=/etc/myconfig[.yaml]
を/etc/myconfig
YAMLとしてロードします。
オリジンチェーン
Origin
インターフェースは、新しいgetParent()
メソッドで更新されました。
これによって、アイテムの出所を正確に示すことができる完全なオリジンチェーンを提供できます。
たとえば、application.properties
でspring.config.import
を使用して、2番目のファイルをインポートできます。
この2番目のファイルからロードされたプロパティのOrigin
には、元のインポート宣言を指す親があります。
actuator/env
またはactuator/configprops
アクチュエータエンドポイントの出力を確認することで、これを自分で試すことができます。
スタートアップエンドポイント
アプリケーションの起動に関する情報を表示する、新しい起動アクチュエータエンドポイントが利用可能になりました。 エンドポイントは、開始に予想よりも時間がかかっているBeanを特定するのに役立ちます。
この作業は、Spring Framwork 5.3に最近追加されたアプリケーションの起動追跡機能に基づいています。 この機能の詳細については、Spring Frameworkのリファレンスドキュメントを参照してください。
Docker/Buildpackのサポート
画像の公開
Mavenプラグインのspring-boot:build-image
ゴールとGradleプラグインのbootBuildImage
タスクに、生成されたイメージをDockerレジストリに公開する機能が追加されました。
イメージを公開するためのプラグインの構成の詳細については、MavenおよびGradleプラグインのドキュメントを参照してください。
認証
Spring Bootのビルドパックサポートを使用する場合、ビルダーまたは実行イメージにプライベート認証済みDockerレジストリを使用できるようになりました。 ユーザ名/パスワードとトークンベースの認証の両方がサポートされています。
MavenとGradle*1のドキュメントが更新され、新しい構成が表示されます。
Paketoビルドパックのデフォルト
Mavenプラグインのspring-boot:build-image
ゴールとGradleプラグインのbootBuildImage
タスクでデフォルトで使用されるイメージビルダーが最新のPaketoイメージにアップグレードされました。
アクセシビリティを向上させるために、PaketoイメージレジストリがGoogle Container RegistryからDocker Hubに変更されました。
Mavenビルドパックのサポート
Mavenのspring-boot:build-image
ゴールによって、すべてのプロジェクトモジュールの依存関係が「アプリケーション」レイヤーに配置されるようになりました。
これは、ビルドに複数のプロジェクトモジュールがある場合、それらはすべて同じレイヤーに配置されることを意味します。
XMLスキーマも更新され、新しい<includeModuleDependencies/>
要素と<excludeModuleDependencies/>
要素を使用してレイヤーをカスタマイズできるようになりました
詳細については、更新されたMavenのドキュメントを参照してください。
Gradleビルドパックのサポート
GradleのbootBuildImage
タスクは、すべてのプロジェクトモジュールの依存関係が「アプリケーション」レイヤーに配置されるようになりました。
これは、ビルドに複数のプロジェクトモジュールがある場合、それらはすべて同じレイヤーに配置されることを意味します。
レイヤーをカスタマイズするときに、DSLでincludeProjectDependencies()
とexcludeProjectDependencies()
を使用することもできます。
詳細については、更新されたGradleのドキュメントを参照してください。
Redisキャッシュメトリクス
Redisキャッシュを使用している場合は、Micrometerを介してキャッシュ統計を公開できるようになりました。 ログに記録されるメトリクスには、hits/missesだけでなく、puts/gets/deletesの数も含まれます。 保留中のリクエストの数とロック待機時間も記録されます。
この機能を有効にするには、spring.cache.redis.enable-statistics
をtrue
に設定します。
Web構成のプロパティ
SpringMVCまたはSpringWebFluxのいずれかを使用したWebロケールとリソースの場所の構成をサポートするためのプロパティが追加されました。 新しいプロパティは次の通りです:
spring.web.locale
spring.web.locale-resolver
spring.web.resources.*
サーブレットまたはリアクティブWebスタックのいずれかを使用したアクチュエータ管理エンドポイントの構成をサポートするために、新しいプロパティが追加されました:
management.server.base-path
これらのSpringMVCおよびサーブレット固有のプロパティは非推奨になり、いずれかのWebスタックをサポートする新しいプロパティが採用されました。
spring.mvc.locale
spring.mvc.locale-resolver
spring.resources.*
management.server.servlet.context-path
サーブレットとフィルタを登録可能な@WebListeners登録
サーブレット@WebListener
クラスは、それ自体がサーブレットとフィルタを登録できるように登録されるようになりました。
以前のバージョンのSpring Bootは、javax.servlet.Registration.Dynamic
への呼び出しを使用してそれらを登録しました。
これは、サーブレット仕様(4.4)の次のセクションが適用されることを意味します。
ServletContextListenerがweb.xmlまたはweb-fragment.xmlで宣言されておらず、@WebListenerアノテーションも付けられていないServletContextListenerのcontextInitializedメソッドにServletContextが渡された場合、サーブレット、フィルターとリスナーのプログラム構成のためにServletContextで定義されたすべてのメソッドに対してUnsupportedOperationExceptionをスローする必要があります。
Spring Boot 2.4以降、動的登録を使用しなくなったため、ServletContextListener.contextInitialized
メソッドからevent.getServletContext().addServlet(…)
およびevent.getServletContext.addFilter(…)
を安全に呼び出すことができます。
Cassandraスライステスト
追加のテストスライスを使用して、@DataCassandraTest
を使用してCassandraに依存するコンポーネントをテストできます。
通常通り、Cassandraリポジトリと必要なインフラストラクチャのみがデフォルトで構成されています。
Testcontainersと@DynamicPropertSource
を使用した例を次に示します。
@DataCassandraTest(properties = "spring.data.cassandra.local-datacenter=datacenter1") @Testcontainers(disabledWithoutDocker = true) class SampleDataCassandraTestIntegrationTests { @Container static final CassandraContainer<?> cassandra = new CassandraContainer<>().withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(2)); @DynamicPropertySource static void cassandraProperties(DynamicPropertyRegistry registry) { registry.add("spring.data.cassandra.contact-points", () -> cassandra.getHost() + ":" + cassandra.getFirstMappedPort()); } ... }
Flyway 7
このリリースはFlyway7にアップグレードされ、いくつかのプロパティが追加されます。
オープンソース版では、次のspring.flyway
プロパティを追加しました:
url
user
password
「teams」エディションを使用している場合は、次のものも利用できます:
cherry-pick
jdbc-properties
oracle-kerberos-cache-file
oracle-kerberos-config-file
skip-executing-migrations
H2コンソールのWeb管理者パスワードの構成プロパティ
H2コンソールのWeb管理者パスワードを構成するための新しい構成プロパティspring.h2.console.settings.web-admin-password
が導入されました。
パスワードは、コンソールの設定とツールへのアクセスを制御します。
ApacheCassandraのCqlSessionベースのヘルスインジケータ
新しいCqlSessionベースのヘルスインジケータであるCassandraDriverHealthIndicator
とCassandraDriverReactiveHealthIndicator
が導入されました。
これらのインジケーターの1つは、CassandraのJavaドライバがクラスパス上にあるときに自動構成されます。
既存のSpring Data Cassandraベースのヘルスインジケータは非推奨になりました。
Prometheusによるフィルタースクレイピング
アクチュエータのPrometheusエンドポイント/actuator/prometheus
は、応答に含まれるサンプルをフィルタリングするために使用できるincludedNames
クエリパラメータをサポートするようになりました。
詳細については、Actuator APIのドキュメントを参照してください。
Spring Security SAML構成プロパティ
Properties have been added to allow configuration of a SAML2 relying party registration’s decryption credentials and Assertion Consumer Service (ACS). The properties are under the following headings:
spring.security.saml2.relyingparty.registration.decryption.*
spring.security.saml2.relyingparty.registration.acs.*
Failure Analyzers
ApplicationContext
が作成されていない場合でも、FailureAnalizersが考慮されるようになりました。
これによって、Environment
処理中にスローされた例外を分析することもできます。
BeanFactoryAware
またはEnvironmentAware
を実装するアナライザーは、ApplicationContext
が作成されない限り使用されないことに注意してください。
Jar最適化
実行可能なSpring Boot jarを生成するときに、空のスターター依存関係が自動的に削除されるようになりました。 ほとんどのスターターは推移的な依存関係しか提供しないため、最終的なjarにパッケージ化しても意味がありません。
Spring Bootアノテーションプロセッサも削除され、ビルド中にのみ役立ちます。
これらは、spring-boot-autoconfigure-processor
とspring-boot-configuration-processor
です。
コードを含まない独自のスターターPOMがある場合は、値が「dependencies-starter」のSpring-Boot-Jar-Type
エントリーをMANIFEST.MFに追加できます。
注釈プロセッサを除外する場合は、値「annotation-processor」を使用して同じプロパティを追加できます。
その他
上記の変更とは別に、次のような多くのマイナーな調整と改善も含みます:
- アプリケーションが実行中のJVMのバージョンを起動時に記録します。
- 末尾の空白は、
logging.config
の値から自動的に削除されます。 - R2DBCプールのサポートによって、追加の構成プロパティが公開されます。
LdapTemplate
の例外処理は、特定の例外を無視するように構成できます。- ISOオフセット日時形式は、MVCおよびWebfluxをサポートします。
AntPathMatcher
の代わりに新しいPathPatternParser
をオプトインする構成プロパティを追加して、リクエストマッピングパスパターンを解析および照合します。@DurationUnit
、@DataSizeUnit
、および@PeriodUnit
は、@ConstructorBinding
を使用してコンストラクタパラメータにアノテーションを付けることができます。- 自動構成された
RabbitConnectionFactory
は、CredentialsProvider
とCredentialsRefreshService
の存在を確認します。 - ヘルスグループは例外のみで定義できます。
AbstractRoutingDataSource
は、management.health.db.ignore-routing-data-sources
を使用したヘルスチェックでは無視できます。- SAML証明書利用者のlocalEntityIdTemplateを設定できます
- HTTPトレースは、ナノ秒の精度で測定されます。
- 専用の
FailureAnalyzer
は、Liquibaseの変更ログが欠落している場合に意味のあるメッセージを提供します。 - Nettyのリクエストデコーダは、
server.netty.*
プロパティを使用してカスタマイズできます。 - Spring Bootバージョンが管理するLiquibaseバージョンと一貫性のあるLiquibaseMavenプラグインのプラグイン管理。
- Prometheus PushGatewayの基本認証サポート。
spring.redis.client-type
を使用してJedisとLettuceの両方が使用可能な場合に、Jedisの選択を許可します。spring.redis.lettuce.cluster.refresh.dynamic-sources
を使用して、Redisクラスタの動的ソースの更新を無効にすることを許可します。- リファレンスドキュメントには、すべての構成例の
Properties
とYAML
の両方が含まれるようになりました。 - RSocketServerのフラグメントサイズは、
spring.rsocket.fragment-size
プロパティを使用してカスタマイズできるようになりました。 - LogbackおよびLog4jロギングで使用されていた文字セットは、プロパティ
logging.charset.console
およびlogging.charset.file
を使用して構成できるようになりました。 - Gradle 6.7以降を使用してSpring Bootアプリケーションを構築する場合、Gradleの構成キャッシュがサポートされます。
依存関係のアップグレード
Spring Boot 2.4は、いくつかのSpringプロジェクトの新しいバージョンに移行します:
- Spring AMQP 2.3 (what’s new)
- Spring Batch 4.3 (what’s new)
- Spring Data 2020.0 (変更ログ)
- Spring Framework 5.3 (what’s new | アップグレード)
- Spring Integration 5.4 (what’s new)
- Spring HATEOAS 1.2 (マイグレーションガイド)
- Spring Kafka 2.6 (what’s new)
- Spring Retry 1.3
- Spring Security 5.4 (what’s new)
- Spring Session 2020.0
多数のサードパーティの依存関係も更新されましたが、その中でも注目すべきものは次のとおりです。
- Artemis 2.13
- AssertJ 3.18
- Cassandra Driver 4.7
- Elasticsearch 7.9
- Flyway 7
- Jersey 2.31
- JUnit 5.7
- Liquibase 3.10
- Lettuce 6.0 (release notes)
- Micrometer 1.6 (release notes)
- Mockito 3.4
- MongoDB 4.1
- Oracle Database 19.7
- Reactor 2020.0 (release notes)
- RSocket 1.1
- Undertow 2.2
Spring Boot2.4での非推奨
ConfigFileApplicationListener
は非推奨になり、ConfigDataEnvironmentPostProcessor
が採用されました。contextClass
に関連するSpringApplicationBuilder
メソッドとSpringApplication
メソッドは非推奨になり、contextFactory
を使用する代替メソッドが優先されます。CloudFoundryVcapEnvironmentPostProcessor
の一部のメソッドは、EnvironmentPostProcessor
の更新が機能するように非推奨になりました(これらはほとんどのユーザに影響するはずです)。BuildLog
ビルドパックサポートクラスは、いくつかのメソッドを廃止し、より詳細な情報を提供する代替メソッドに置き換えました。LoggingSystemProperties
のログバック定数は非推奨になり、LogbackLoggingSystemProperties
が優先されます。UndertowServletWebServerFactory
のisEagerInitFilters
/setEagerInitFilters
メソッドは、isEagerFilterInit
/setEagerFilterInit
に置き換えられました。ApplicationEnvironmentPreparedEvent
、ApplicationStartingEvent
、およびSpringApplicationRunListener
のいくつかのメソッドは、BootstrapContext
をサポートするために非推奨になりました。- ビルドパックサポートの
BuildLog
が更新され、より多くのデータがサポートされるようになりました(ほとんどのユーザはこのクラスを直接使用しません)。 - 一部のSpringMVCおよびサーブレット固有のプロパティは非推奨になりました(上記の「Web構成のプロパティ」セクションを参照)。
- Spring Data Cassandraを使用するヘルスインジケータは非推奨になり、rawドライバを使用するインジケータが優先されます。
当ブログについて(プライバシーポリシー・免責事項など)
プライバシーポリシー
個人情報の利用目的
当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。
取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。
広告について
当ブログでは、第三者配信の広告サービスを利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、Cookieを使用しております。
Cookieを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。
Cookieを無効にする方法やGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご確認ください。
また、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムに参加しています。
アクセス解析ツールについて
当ブログでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しております。トラフィックデータは匿名で収集されており、個人を特定するものではありません。
コメントについて
当ブログへのコメントを残す際に、IP アドレスを収集しています。
これはブログの標準機能としてサポートされている機能で、スパムや荒らしへの対応以外にこのIPアドレスを使用することはありません。
なお、全てのコメントは管理人が事前にその内容を確認し、承認した上での掲載となります。あらかじめご了承ください。
免責事項
当ブログからのリンクやバナーなどで移動したサイトで提供される情報、サービス等について一切の責任を負いません。
また当ブログのコンテンツ・情報について、できる限り正確な情報を提供するように努めておりますが、正確性や安全性を保証するものではありません。情報が古くなっていることもございます。
当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
著作権について
当ブログで掲載している文章や画像などにつきましては、無断転載することを禁止します。
当ブログは著作権や肖像権の侵害を目的としたものではありません。著作権や肖像権に関して問題がございましたら、お問い合わせフォームよりご連絡ください。迅速に対応いたします。
リンクについて
当ブログは基本的にリンクフリーです。リンクを行う場合の許可や連絡は不要です。
ただし、インラインフレームの使用や画像の直リンクはご遠慮ください。
【Eclipse】便利なショートカット集
よく使う、もしくは覚えておくと便利だと思うEclipseのショートカットをまとめます。
ソースコード編集系は主に受講生に、ソースコード解析系は主に講師の皆様に評判良さげでした。
キーはすべてデフォルト設定の場合のものです。
コピペなど、他のエディタ等でも同じものは省いています。
ソースコードの編集に関するもの
コメントを付ける/外す
Ctrl + /
カーソルがある行の行頭に"//"を追加します。
複数行を選択することも可能です。
選択した行がすべて"//"で始まるコメント行であった場合、選択行の"//"が外れます。
コメントアウトしたいときに便利。
選択行を移動する
Alt + ↑ または ↓
カーソルがある行を1行上または1行下と入れ替えます。
あるバージョンからは複数行を選択することも可能です。
(筆者はバージョン4.4で確認。3.5あたりではできなかった気がします。)
近い行に移動したいときなどはコピペより楽。
行を削除する
Ctrl + D
カーソルがある行を削除します。
複数行を選択することも可能です。
使う機会が比較的多く、地味に便利。
形式を整える(フォーマット)
Ctrl + Shift + F
選択しているソースファイルのインデント、空行・スペースの有無などを修正します。
対象ファイルに構文エラーがあると使えません。
コード規約にあると保存前に必ずやるはずなので、覚えておくと楽。
インデントを整える
Ctrl + I
選択行のインデントを修正します。
前述のフォーマットと違い、インデント以外は修正しません。
こちらは構文エラーがあっても使えます。
}が多い/少ないなどでエラーが出ているときの確認に使えます。
あくまで選択行しか修正しないので、この前に全選択(Ctrl + A)をしておくと良いです。
変数やメソッドの名前を変える
Alt + Shift + R
カーソルがある箇所の変数またはメソッド名を変更できる状態にします。
ちゃんとスコープを判断してくれるので、余計なところを変えなくて済みます。
特に、短い名前の変数を変えたいときは置換より圧倒的に楽。
入力を補完する
Ctrl + Space
入力補完の候補を表示します。
候補が一意に決まる場合は、その文を自動的に挿入します。
「System.out.println()」は、「sysout」と入力して「Ctrl + Space」をすれば一発で挿入できます。
良く書く場合は覚えておくと非常に便利。
ソースコードの解析に関するもの
宣言を開く
F3
選択している変数またはメソッドを宣言している箇所に移動します。
主にメソッドの中身を見たいときに便利。
呼び出し階層を開く
Ctrl + Alt + H
カーソルがある箇所のメソッドの呼び出し階層を調べます。
メンバ変数に対しても使えます。
メソッドがどこから呼ばれているかを調べるときに便利。
エディタを水平方向に分割する/元に戻す
Ctrl + {
エディタのウィンドウを複製して、水平方向に分割します。
すでに分割されていた場合は、分割を解除します。
垂直方向に分割したい場合は、「Ctrl + \」でできます。
そこまで使わないけど間違って入力してしまうことがあるので、解除用に頭に入れておくと楽。
ウィンドウに関するもの
ビューの移動
Ctrl + F7
その時点で開いているビューの一覧を表示し、
Ctrlを離した時点で選択しているビューを選択した状態にします。
Ctrlを離す前であれば、F7または↑↓キーでビューを選択できます。
標準入力を使うプログラムを実行するとき、マウスを使わなくて済みます。
エディタ間の移動
Ctrl + F6
その時点で開いているソースファイル一覧を表示し、
Ctrlを離した時点で選択しているソースファイルを選択した状態にします。
Ctrlを離す前であれば、F6または↑↓キーでソースファイルを選択できます。
エディタ以外のビューを選択した状態でも使えます。
【プログラミング問題】エラトステネスの篩
解答例 の対応言語
問題
エラトステネスの
なお、エラトステネスの篩のアルゴリズムは次の通りです。
(エラトステネスの篩 - Wikipediaから抜粋、一部修正。)
期待する出力結果
2
3
5
7
11
13・
・(中略)
・
9949
9967
9973