Spring Bootの2.7系から3.1系へのバージョンアップ対応のハマりどころ

Spring Bootの2.7系から3.1系へのバージョンアップ対応のハマりどころ
カテゴリ
技術
タグ
Java
Spring Boot
バージョンアップ

Spring Bootのバージョンアップに際して、一部ソースコード修正などの対応が必要になる部分が少なからずあります。私がハマったところベースでいくつか対応方法を説明していきたいと思います。

サポート期間が、2.7.xと3.0.xとでほとんど変わらないため、多くは3.1.xまで一気に上げるかと思われます。メジャーバージョンアップである「2.7.x→3.0.x」が、破壊的変更もあって、対応としてはかなり大変ですが、マイナーバージョンアップである「3.0.x→3.1.x」のほうは影響がないことがほとんどだと思います。

大まかな流れは下記の公式の移行ガイド(英語)を読みながら進めていくのが良いかと思います。

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide

Spring Security 6系への対応

SecurityConfigurationの実装の仕方を変える必要があります。WebSecurityConfigurerAdapterを継承して構築していたかと思われますが、これが非推奨となり、SecurityFilterChainを@Beanで定義する実装に修正する必要があります。3.0.x

【2.7.xまでのコード例】

1import org.springframework.beans.factory.annotation.Autowired;
2import org.springframework.context.annotation.Configuration;
3import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
4import org.springframework.security.config.annotation.web.builders.HttpSecurity;
5import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
6
7@Configuration
8public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
9  @Autowired
10  public void configure(AuthenticationManagerBuilder auth) throws Exception {
11    auth.inMemoryAuthentication();
12  }
13
14  @Override
15  protected void configure(HttpSecurity http) throws Exception {
16    http.authorizeRequests()
17        .antMatchers("/health/**")
18        .permitAll()
19        .anyRequest()
20        .authenticated();
21    http.csrf().disable();
22  }
23}

【3.0.xでのコード修正例】

1import org.springframework.context.annotation.Bean;
2import org.springframework.context.annotation.Configuration;
3import org.springframework.security.config.annotation.web.builders.HttpSecurity;
4import org.springframework.security.provisioning.InMemoryUserDetailsManager;
5import org.springframework.security.web.SecurityFilterChain;
6
7@Configuration
8public class SecurityConfiguration {
9  @Bean
10  public InMemoryUserDetailsManager userDetailsService() {
11    return new InMemoryUserDetailsManager();
12  }
13
14  @Bean
15  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
16    http.authorizeHttpRequests()
17        .requestMatchers("/health/**")
18        .permitAll()
19        .anyRequest()
20        .authenticated();
21    http.csrf().disable();
22    return http.build();
23  }
24}

修正ポイント

  • WebSecurityConfigurerAdapter の継承を辞める。
  • configure(HttpSecurity)のOverrideではなく、public SecurityFilterChain securityFilterChain(HttpSecurity)を@Bean定義する。
    • その中で、HttpSecurity.authorizeRequests()ではなく、HttpSecurity.authorizeHttpRequests()を使うように変更。(非常に視認性が悪いですが、authorizeHttpRequestsという異なる名称のものがあります。)
  • LDAP認証、JDBC認証、インメモリ認証を使う場合はそれぞれ対応が必要。何れも下記のページを参照して対応するのがわかりやすい。
https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

javax → jakarta置換

商標権の都合で、java EE系のパッケージが、jakarta EEというパッケージに変わっています。基本的に中身が変わる類のものではないので、ソースコードの置換をしていく対応となります。

ただし、引き続きjavaxパッケージとして使われるものも多いので、javaxをjakartaに全て一括置換はNGです。コンパイル時にClassNotFoundが発生すると思うので、それらを何度か適宜置換していく対応していってください。「javax.annotation → jakarta.annotation」の置換でそれなりに充足すると思います。

httpClientが 4.x -> 5.x に変更

SpringBootの内部依存しているhttpClientのメジャーバージョンが変わっており、その変更に対応する必要があります。RestTemplateで使っている人も多い部分かと思います。それなりにガッツリ変わっているので、頑張って移行ガイドを読んでいく必要があります。

【2.7.xまでのコード例】

1  @Bean
2  public RestTemplate restTemplate() throws NoSuchAlgorithmException {
3    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
4    httpClientBuilder.setSSLContext(SSLContext.getDefault());
5
6    HttpComponentsClientHttpRequestFactory requestFactory =
7        new HttpComponentsClientHttpRequestFactory();
8    requestFactory.setHttpClient(httpClientBuilder.build());
9    requestFactory.setConnectTimeout(5000);
10    requestFactory.setReadTimeout(5000);
11
12    return new RestTemplate(requestFactory);
13  }

【3.0.xでのコード修正例】

1  @Bean
2  public RestTemplate restTemplate() throws NoSuchAlgorithmException {
3
4    try (PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
5        .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create()
6            .setSslContext(SSLContext.getDefault())
7            .setTlsVersions(TLS.V_1_3)
8            .build())
9        .setDefaultSocketConfig(SocketConfig.custom()
10            .setSoTimeout(Timeout.ofSeconds(5L))
11            .build())
12        .setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
13        .setDefaultConnectionConfig(ConnectionConfig.custom()
14            .setConnectTimeout(Timeout.ofSeconds(5L))
15            .build())
16        .build()) {
17      HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
18      httpClientBuilder.setConnectionManager(connectionManager);
19      HttpComponentsClientHttpRequestFactory requestFactory =
20          new HttpComponentsClientHttpRequestFactory();
21      requestFactory.setHttpClient(httpClientBuilder.build());
22
23      return new RestTemplate(requestFactory);
24    }
25  }

修正ポイント

ポイントと言えるほど要点があるわけではなく、、下記リンク先の移行ガイド(英語)を参考にがっつり書き換えていく必要があります。ReadTimeoutというのが非推奨となって、SoTimeoutに変えるなど、かなりしっかりと読まないとなりません。

https://hc.apache.org/httpcomponents-client-5.2.x/migration-guide/preparation.html
https://hc.apache.org/httpcomponents-client-5.2.x/migration-guide/migration-to-classic.html

hibernate の5.x → 6.xの対応

ORMである、hibernateのメジャーバージョンアップがなされています。hibernateを利用している場合は、これに対応する必要がありますが、破壊的変更が非常に多く、おそらく大多数の方が多大な対応を必要とすると思われます。Type systemという根幹がかなり変わっているため、影響が大きいです。変更内容も広範になるため、別記事にまとめようと思います。

下記がhibernate公式の移行ガイド(英語)です。

https://docs.jboss.org/hibernate/orm/6.0/migration-guide/migration-guide.html

関連記事

  1. Spring Bootの2.7系から3.1系へのバージョンアップ対応のハマりどころ

    Spring Bootのバージョンアップに際して、一部ソースコード修正などの対応が必要になる部分が少なからずあります。私がハマったところベースでいくつか対応方法を説明していきたいと思います。 サポート期間が、2.7.xと […]

  2. 【オンライン】 JJUG CCC 2022 Spring 発表資料・動画まとめ

    2022-6-19(日)に行われた JJUG CCC 2022 Spring でのセッション発表資料・動画で公開されているもののリンクをまとめています。 情報取得元:twitterのハッシュタグ(#jjug_ccc)検索 […]

  3. 【オンライン】 JJUGナイトセミナー「開発環境の最前線」

    JJUGナイトセミナー「開発環境の最前線」の簡単なまとめです。 VSCode で Java アプリの開発ができるってご存じですか? VSCode はエディタですが、VSCode に Java 開発用のプラグインをインスト […]

  4. 【オンライン】 JJUG CCC 2021 Fall 発表資料・動画まとめ

    2021-11-21(日)09:30 – 19:00 に行われた JJUG CCC 2021 Fall でのセッション発表資料・動画で公開されているもののリンクをまとめています。 情報取得元:twi […]

  5. 【オンライン】 JJUG CCC 2020 Fall 発表資料・動画まとめ

    2020-11-07(土)09:30 – 19:00 に行われる JJUG CCC 2020 Fall でのセッション発表資料で公開されているものをまとめています。 情報取得元:twitterのハッ […]

  6. 【オンライン】 JJUG CCC 2021 Spring 発表資料・動画まとめ

    2021-05-23(日)09:30 – 19:00 に行われた JJUG CCC 2021 Spring でのセッション発表資料で公開されているものをまとめています。 情報取得元:twitterのハッシュタ […]