SpringBoot3這些變化一定要記住了
環(huán)境:SpringBoot.3.0.5
1.Spring MVC 和 WebFlux URL 匹配更改
從 Spring Framework 6.0 開始,尾部斜杠匹配配置選項(xiàng)已被棄用,其默認(rèn)值設(shè)置為false。如下示例:
// 在Spring6之前匹配下面兩個(gè)路徑
// 1. /some/greeting
// 2. /some/greeting/
@GetMapping("/some/greeting")
public String greeting() {
return "Hello";
}
// 在spring6之后版本中只能匹配/some/greeting這一個(gè)路徑
你可以通過(guò)如下方式支持尾部斜杠
@GetMapping("/some/greeting", "/some/greeting/")
或
// spring mvc
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(true) ;
}
}
// webflux
@Configuration
public class WebConfiguration implements WebFluxConfigurer {
@Override
public void configurePathMatching(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(true) ;
}
}
2. Http Header大小配置
在Spring6之前版本,server.max-http-header-size在四個(gè)支持的嵌入式web服務(wù)器上的處理不一致。當(dāng)使用Jetty、Netty或Undertow時(shí),它會(huì)配置最大HTTP請(qǐng)求頭大小。當(dāng)使用Tomcat時(shí),它會(huì)配置最大HTTP請(qǐng)求和響應(yīng)頭大小。
為了解決這種不一致,server.max-http-header-size已被棄用,并引入了server.max-http-request-header-size的替代品。這兩個(gè)屬性現(xiàn)在只適用于請(qǐng)求header大小,而與底層的web服務(wù)器無(wú)關(guān)。
# Spring6之前版本
server:
max-http-header-size: 8KB
# Spring6之后版本
server:
max-http-request-header-size: 8KB
要限制Tomcat或Jetty(僅有的兩個(gè)服務(wù)器支持這樣的設(shè)置)上HTTP響應(yīng)頭的最大大小,請(qǐng)使用WebServerFactoryCustomizer。
public class WebConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
// ...
}
}
Jetty
Jetty還不支持Servlet 6.0。要在Spring Boot 3.0中使用Jetty,必須將Servlet API降級(jí)到5.0。您可以使用jakarta-servlet。屬性來(lái)執(zhí)行此操作。
3. RestTemplate 中的 Apache HttpClient
Spring6已刪除對(duì) Apache HttpClient 的支持,并替換為org.apache.httpcomponents.client5:httpclient5(注意:此依賴項(xiàng)具有不同的 groupId)。如果您注意到 HTTP 客戶端行為存在問(wèn)題,則可能是RestTemplate回退到 JDK 客戶端。org.apache.httpcomponents:httpclient可以由其他依賴項(xiàng)傳遞傳遞,因此您的應(yīng)用程序可能依賴此依賴項(xiàng)而不聲明它。
4. Actuator Endpoints清理
因?yàn)?env和/configprops端點(diǎn)可以包含敏感值,所以默認(rèn)情況下所有值總是被屏蔽。這曾經(jīng)只適用于敏感的鍵。
SpringBoot3之前版本,如下2.7.16 訪問(wèn)/env返回結(jié)果:
圖片
只對(duì)敏感信息加密處理。
SpringBoot3中,如下3.2.1 訪問(wèn)/env返回結(jié)果:
圖片
圖片
所有值都加密處理了。
你可以通過(guò)如下配置進(jìn)行顯示
management:
endpoint:
env:
show-values: always
configprops:
show-values: always
自定義加密處理功能
@Configuration
public class ActuatorConfig {
@Bean
SanitizingFunction sanitizingFunction() {
return data -> {
return data.withValue("------") ;
};
}
}
圖片
5. 配置更改
Cassandra屬性
Cassandra的配置屬性已經(jīng)從spring.data.cassandra改變?yōu)閟pring.cassandra .
Redis屬性
Redis的配置屬性已經(jīng)從spring.redis改變?yōu)閟pring.data.redis。因?yàn)閞edis自動(dòng)配置要求Spring數(shù)據(jù)存在于classpath中。
MySQL JDBC驅(qū)動(dòng)
MySQL JDBC驅(qū)動(dòng)程序的坐標(biāo)已經(jīng)從mysql:mysql-connector-java更改為com.mysql:mysql-connector-j。如果你使用的是MySQL JDBC驅(qū)動(dòng),升級(jí)到Spring Boot 3.0時(shí)要相應(yīng)地更新它的坐標(biāo)。
Spring Security 改變
Spring Boot 3.0已升級(jí)到Spring Security 6.0。
ReactiveUserDetailsService
在AuthenticationManagerResolver存在時(shí),ReactiveUserDetailsService不再自動(dòng)配置。如果應(yīng)用程序依賴于ReactiveUserDetailService,盡管存在AuthenticationManagerResolver,請(qǐng)定義自己的ReactiveUserDetailsService bean來(lái)滿足其需求。