shiroの知恵袋

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

【バグ記録】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 を利用することになりましたので、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は今後の削除のために非推奨になりました。

AsciiDocのテーブル内にPlantUMLの図を埋め込む方法

やりたいこと

Asciidocのテーブル内にPlantUMLを埋め込みたい。

方法

  • テーブル区切り記号 | の前に a を付ける。
  • UMLに使う |\エスケープする。

具体例

AsciiDocコード

|===
|継承|実装

a|[plantuml, extends.svg, svg]
....
abstract class Parent
Parent <\|-- Child1
Parent <\|-- Child2
....

a|[plantuml, implements.svg, svg]
....
interface Parent
Parent <\|.. Child1
Parent <\|.. Child2
....
|===

結果

f:id:shiroN:20211223215248j:plain
AsciiDocテーブル内にUMLを埋め込む例

【Spring Boot 2.4 Release Notes】日本語訳

はじめに

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

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

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

github.com

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

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-namelogging.logback.rollingpolicy.file-name-pattern
  • logging.file.clean-history-on-startlogging.logback.rollingpolicy.clean-history-on-start
  • logging.file.max-sizelogging.logback.rollingpolicy.max-file-size
  • logging.file.total-size-caplogging.logback.rollingpolicy.total-size-cap
  • logging.file.max-historylogging.logback.rollingpolicy.max-history

それらがマップするシステム環境プロパティも同様です:

  • ROLLING_FILE_NAME_PATTERNLOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN
  • LOG_FILE_CLEAN_HISTORY_ON_STARTLOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START
  • LOG_FILE_MAX_SIZELOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE
  • LOG_FILE_TOTAL_SIZE_CAPLOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP
  • LOG_FILE_MAX_HISTORYLOGBACK_ROLLINGPOLICY_MAX_HISTORY

デフォルトサーブレット登録

Spring Boot 2.4は、サーブレットコンテナによって提供されるDefaultServletを登録しなくなります。 ほとんどのアプリケーションでは、Spring MVCDispatcherServletが必要な唯一のサーブレットであるため使用されません。

デフォルトのサーブレットがまだ必要な場合は、server.servlet.register-default-servlettrueに設定できます。

HTTPトレースにデフォルトでCookieヘッダが含まれない

CookieリクエストヘッダとSet-Cookieレスポンスヘッダは、デフォルトでHTTPトレースに含まれなくなりました。 Spring Boot 2.3の動作を復元するには、cookies, errors, request-headers, response-headersmanagement.trace.http.includeを設定します。

転送のUndertowパス

デフォルトでは、Undertowはリクエストが転送されるときに元のリクエストURLを保持します。 このリリースは、サーブレット仕様に準拠するためにUndertowのデフォルトをオーバーライドします。 以前のUndertowのデフォルトの動作は、プロパティserver.undertow.preserve-path-on-forwardtrueに設定することで復元できます。

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およびOrde​​redを介してサポートする登録注文に依存しているすべての人にとって重大な変更になります。

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-processingtrueに設定していない限り、メインのapplication.propertiesまたはapplication.ymlから直接追加プロパティとyamlファイルをインポートできるようになりました。

spring.config.importプロパティを使用して、Spring環境にインポートする必要がある1つ以上の追加の構成ファイルを指定できます。詳細については、リファレンスガイドのこのセクションを参照してください。

これらの変更を行った理由を説明するショートブログを公開しました。

ボリュームマウントされた構成ディレクトリツリー

spring.config.importプロパティを使用して、Kubernetesで一般的に使用される構成ツリーをインポートすることもできます。 構成ツリーは、キー/値のペアを提供する別の方法です。 各ペアは独自のファイルで宣言され、ファイル名がプロパティキーを形成し、ファイルの内容が値を提供します。

完全な例については、更新されたリファレンスドキュメントを参照してください。

構成ツリーからロードされたプロパティには、デフォルトで末尾の改行文字がトリミングされています。

ファイル拡張子のない設定ファイルのインポート

一部のクラウドプラットフォームでは、ファイル拡張子なしでファイルをボリュームマウントすることしかできません。 このような制約がある場合は、コンテンツタイプに関するヒントをSpring Bootに提供することで、これらのファイルをインポートできるようになりました。 例えば、spring.config.import=/etc/myconfig[.yaml]/etc/myconfigYAMLとしてロードします。

オリジンチェーン

Originインターフェースは、新しいgetParent()メソッドで更新されました。 これによって、アイテムの出所を正確に示すことができる完全なオリジンチェーンを提供できます。

たとえば、application.propertiesspring.config.importを使用して、2番目のファイルをインポートできます。 この2番目のファイルからロードされたプロパティのOriginには、元のインポート宣言を指す親があります。

actuator/envまたはactuator/configpropsアクチュエータエンドポイントの出力を確認することで、これを自分で試すことができます。

スタートアップエンドポイント

アプリケーションの起動に関する情報を表示する、新しい起動アクチュエータエンドポイントが利用可能になりました。 エンドポイントは、開始に予想よりも時間がかかっているBeanを特定するのに役立ちます。

この作業は、Spring Framwork 5.3に最近追加されたアプリケーションの起動追跡機能に基づいています。 この機能の詳細については、Spring Frameworkのリファレンスドキュメントを参照してください。

新しいアクチュエータAPIここに記載されています。

Docker/Buildpackのサポート

画像の公開

Mavenプラグインspring-boot:build-imageゴールとGradleプラグインbootBuildImageタスクに、生成されたイメージをDockerレジストリに公開する機能が追加されました。

イメージを公開するためのプラグインの構成の詳細については、MavenおよびGradleプラグインのドキュメントを参照してください。

認証

Spring Bootのビルドパックサポートを使用する場合、ビルダーまたは実行イメージにプライベート認証済みDockerレジストリを使用できるようになりました。 ユーザ名/パスワードとトークンベースの認証の両方がサポートされています。

MavenGradle*1のドキュメントが更新され、新しい構成が表示されます。

Paketoビルドパックのデフォルト

Mavenプラグインspring-boot:build-imageゴールとGradleプラグインbootBuildImageタスクでデフォルトで使用されるイメージビルダーが最新のPaketoイメージにアップグレードされました。 アクセシビリティを向上させるために、PaketoイメージレジストリGoogle Container RegistryからDocker Hubに変更されました。

Mavenビルドパックのサポート

Mavenspring-boot:build-imageゴールによって、すべてのプロジェクトモジュールの依存関係が「アプリケーション」レイヤーに配置されるようになりました。 これは、ビルドに複数のプロジェクトモジュールがある場合、それらはすべて同じレイヤーに配置されることを意味します。

XMLスキーマも更新され、新しい<includeModuleDependencies/>要素と<excludeModuleDependencies/>要素を使用してレイヤーをカスタマイズできるようになりました

詳細については、更新されたMavenのドキュメントを参照してください。

Gradleビルドパックのサポート

GradleのbootBuildImageタスクは、すべてのプロジェクトモジュールの依存関係が「アプリケーション」レイヤーに配置されるようになりました。 これは、ビルドに複数のプロジェクトモジュールがある場合、それらはすべて同じレイヤーに配置されることを意味します。

レイヤーをカスタマイズするときに、DSLincludeProjectDependencies()excludeProjectDependencies()を使用することもできます。

詳細については、更新されたGradleのドキュメントを参照してください。

Redisキャッシュメトリクス

Redisキャッシュを使用している場合は、Micrometerを介してキャッシュ統計を公開できるようになりました。 ログに記録されるメトリクスには、hits/missesだけでなく、puts/gets/deletesの数も含まれます。 保留中のリクエストの数とロック待機時間も記録されます。

この機能を有効にするには、spring.cache.redis.enable-statisticstrueに設定します。

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ベースのヘルスインジケータであるCassandraDriverHealthIndicatorCassandraDriverReactiveHealthIndicatorが導入されました。 これらのインジケーターの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:

Failure Analyzers

ApplicationContextが作成されていない場合でも、FailureAnalizersが考慮されるようになりました。 これによって、Environment処理中にスローされた例外を分析することもできます。

BeanFactoryAwareまたはEnvironmentAwareを実装するアナライザーは、ApplicationContextが作成されない限り使用されないことに注意してください。

Jar最適化

実行可能なSpring Boot jarを生成するときに、空のスターター依存関係が自動的に削除されるようになりました。 ほとんどのスターターは推移的な依存関係しか提供しないため、最終的なjarにパッケージ化しても意味がありません。

Spring Bootアノテーションプロセッサも削除され、ビルド中にのみ役立ちます。 これらは、spring-boot-autoconfigure-processorspring-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は、CredentialsProviderCredentialsRefreshServiceの存在を確認します。
  • ヘルスグループは例外のみで定義できます。
  • 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クラスタの動的ソースの更新を無効にすることを許可します。
  • リファレンスドキュメントには、すべての構成例のPropertiesYAMLの両方が含まれるようになりました。
  • 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 Boot2.4での非推奨

  • ConfigFileApplicationListenerは非推奨になり、ConfigDataEnvironmentPostProcessorが採用されました。
  • contextClassに関連するSpringApplicationBuilderメソッドとSpringApplicationメソッドは非推奨になり、contextFactoryを使用する代替メソッドが優先されます。
  • CloudFoundryVcapEnvironmentPostProcessorの一部のメソッドは、EnvironmentPostProcessorの更新が機能するように非推奨になりました(これらはほとんどのユーザに影響するはずです)。
  • BuildLogビルドパックサポートクラスは、いくつかのメソッドを廃止し、より詳細な情報を提供する代替メソッドに置き換えました。
  • LoggingSystemPropertiesのログバック定数は非推奨になり、LogbackLoggingSystemPropertiesが優先されます。
  • UndertowServletWebServerFactoryisEagerInitFilters / setEagerInitFiltersメソッドは、isEagerFilterInit / setEagerFilterInitに置き換えられました。
  • ApplicationEnvironmentPreparedEventApplicationStartingEvent、およびSpringApplicationRunListenerのいくつかのメソッドは、BootstrapContextをサポートするために非推奨になりました。
  • ビルドパックサポートのBuildLogが更新され、より多くのデータがサポートされるようになりました(ほとんどのユーザはこのクラスを直接使用しません)。
  • 一部のSpringMVCおよびサーブレット固有のプロパティは非推奨になりました(上記の「Web構成のプロパティ」セクションを参照)。
  • Spring Data Cassandraを使用するヘルスインジケータは非推奨になり、rawドライバを使用するインジケータが優先されます。

*1:本文ではMavenのリンクが貼られていますが、筆者判断でGradle側に変更しました。

当ブログについて(プライバシーポリシー・免責事項など)

プライバシーポリシー

個人情報の利用目的

当ブログでは、お問い合わせや記事へのコメントの際、名前やメールアドレス等の個人情報を入力いただく場合がございます。
取得した個人情報は、お問い合わせに対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、これらの目的以外では利用いたしません。

広告について

当ブログでは、第三者配信の広告サービスを利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、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または↑↓キーでソースファイルを選択できます。
エディタ以外のビューを選択した状態でも使えます。

エディタを選択する

F12

エディタを選択した状態にします。
Eclipse以外のウィンドウを選択していると使えません。(当たり前ですが…)

【プログラミング問題】エラトステネスの篩

解答例 の対応言語

Python

 

問題

エラトステネスのふるいを使って10000以下の素数を表示してください。

 

なお、エラトステネスの篩のアルゴリズムは次の通りです。

エラトステネスの篩 - Wikipediaから抜粋、一部修正。)

  1. 探索リストに2から指定した値xまでの整数を昇順で入れる。
  2. 探索リストの先頭の数を素数リストに移動し、その倍数を探索リストから削除する。
  3. 上記2の操作を探索リストの先頭値がxの平方根に達するまで行う。
  4. 探索リストに残った数を素数リストに移動する。

 

期待する出力結果

2
3
5
7
11
13

・(中略)

9949
9967
9973

 

 

解答例