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