Spring Boot 2.5.6 to 3.0.2 migration 筆記

正在練習把玩的 Spring Boot 用的是 2.5.6,剛剛升級到 3.0.2,這邊隨手記錄必須的改動

升級 Java#

換上 3.0.2 之後,Java 必須要升級到 17 以上,我原本是用 Java 11,所以 IDE 跟 Console 的 JDK 都換成了 19

升級 Gradle#

JDK 換成 19 之後跑 gradle 會遇到莫名的 PermittedSubclasses requires ASM9

我把原本的 gradle-7.2 換成 gradle-7.6 就沒事了

更換 jakarta 的 package name#

Spring Boot 3.0 Release Note 有說 Jakarta Persistence 為 3.1

Wiki 說明 Jakarta Persistence 3.0 之後把 package name 從 javax.persistence 換成 jakarta.persistence,因此要做類似的修改

1
2
3
4
5
6
7
8
+import jakarta.persistence.Column
+import jakarta.persistence.Entity
+import jakarta.persistence.Id
+import jakarta.persistence.Table
-import javax.persistence.Column
-import javax.persistence.Entity
-import javax.persistence.Id
-import javax.persistence.Table

更新 Spring Security 的語法#

  • authorizeRequest 已經 deprecated
  • antMatchers 要換成 requestMatchers

另外有個比較雷的地方,原本我只要用 @EnableWebSecurity 就能注入 Security 相關的 Bean,更新之後要再加上 @Configuration 否則不會有效果

前後差異如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
+@Configuration
 @EnableWebSecurity
 class AppSecurityConfig {

     @Bean
     fun createFilterChain(http: HttpSecurity): SecurityFilterChain {
         // public
         http
-            .authorizeRequests()
-            .antMatchers("/").permitAll()
+            .authorizeHttpRequests()
+            .requestMatchers("/").permitAll()
         ....

開發期略過 h2-console#

如果你有用 h2-console,而且在開發期想要避開 spring security,可以利用 toH2Console

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import org.springframework.boot.autoconfigure.security.servlet.PathRequest.toH2Console
...

fun createFilterChain(http: HttpSecurity): SecurityFilterChain {
    http.headers().frameOptions().sameOrigin()

    http.csrf().ignoringRequestMatchers(toH2Console())

    http.authorizeHttpRequests()
        .requestMatchers(toH2Console())
        // .requestMatchers(antMatcher("/h2-console/**")) // either this one is fine
        .permitAll()

    .....

    return http.build()
}