SpringBoot3.4配置校驗新特性的用法詳解
配置屬性驗證增強亮點
Spring Boot 3.4 對配置校驗支持進(jìn)行了全面升級,核心亮點包括:
- 支持 jakarta.validation 全套標(biāo)準(zhǔn)注解(如
@NotNull
、@Email
、@Pattern
等) - 嵌套對象、集合元素 的深度校驗支持
- 啟動階段校驗失敗,IDE友好提示,快速定位問題
- 自動生成更完善的開發(fā)時元信息(metadata)
可以說,從易用性到嚴(yán)謹(jǐn)性,都有了質(zhì)的飛躍!
基本用法示例
定義配置類
以用戶配置為例:
package com.icoderoad.demo.config; import jakarta.validation.Valid; import jakarta.validation.constraints.*; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import java.util.List; @Validated @ConfigurationProperties(prefix = "app.user") public class UserProperties { @NotBlank(message = "用戶名不能為空") private String username; @Email(message = "郵箱格式不正確") private String email; @Min(value = 18, message = "年齡不能小于18歲") private Integer age; @Valid private Address address; @Size(min = 1, message = "至少需要一個角色") private List<@NotBlank(message = "角色名稱不能為空") String> roles; // Address是嵌套對象,需要加@Valid public static class Address { @NotBlank(message = "城市不能為空") private String city; @Pattern(regexp = "\d{6}", message = "郵編必須是6位數(shù)字") private String zipCode; // getter/setter public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getZipCode() { return zipCode; } public void setZipCode(String zipCode) { this.zipCode = zipCode; } } // getter/setter public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List<String> getRoles() { return roles; } public void setRoles(List<String> roles) { this.roles = roles; } }
配置 application.yml
app: user: username: "張三" email: "zhangsan@example.com" age: 25 address: city: "上海" zipCode: "200000" roles: - "admin" - "user"
注入使用
在你的服務(wù)中注入:
package com.icoderoad.demo.service; import com.example.demo.config.UserProperties; import org.springframework.stereotype.Service; @Service public class UserService { private final UserProperties userProperties; public UserService(UserProperties userProperties) { this.userProperties = userProperties; } public void printUserInfo() { System.out.println("用戶名:" + userProperties.getUsername()); System.out.println("郵箱:" + userProperties.getEmail()); } }
嵌套對象與集合元素深度校驗
注意,在嵌套對象上必須標(biāo)注 @Valid
,才能對子屬性繼續(xù)校驗。集合元素(如 List<String>
)同樣支持元素級校驗注解!
這讓配置類的約束更加細(xì)粒度、安全。
啟動階段即校驗失敗
如果配置不符合要求,比如漏填 username
、郵箱格式錯誤、年齡不足18歲、角色列表為空等,Spring Boot 啟動時就會直接報錯!
示例錯誤日志:
***************************
APPLICATION FAILED TO START
***************************
Description:
Binding to target [Bindable@xxx type = com.icoderoad.demo.config.UserProperties] failed:
Property: app.user.username
Value:
Reason: 用戶名不能為空
Property: app.user.email
Value: not-an-email
Reason: 郵箱格式不正確
非常直觀,能第一時間發(fā)現(xiàn)配置問題,避免服務(wù)上線后隱患!
開發(fā)時元信息增強
配合 Spring Boot 的 spring-boot-configuration-processor
插件,還能自動生成提示補全信息(IDE 中 .yml
配置智能提示)!
pom.xml
配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
編譯后,會生成 META-INF/spring-configuration-metadata.json
,供 IDE 智能補全參考。
注意事項
@ConfigurationProperties
必須配合@Validated
- 嵌套對象字段要加
@Valid
- 集合元素校驗,需要在泛型上加注解
- 使用 Jakarta Validation 標(biāo)準(zhǔn)注解(Spring Boot 3.x 默認(rèn)使用 Jakarta)
擴展:錯誤處理更友好(自定義異常消息格式)
默認(rèn)啟動校驗失敗時,Spring Boot 拋出 BindValidationException
,信息雖然完整但略顯雜亂。為了讓錯誤提示更專業(yè)友好,我們可以自定義異常處理。
定義友好的異常類
package com.icoderoad.demo.exception; /** * 自定義配置校驗異常 */ public class ConfigValidationException extends RuntimeException { public ConfigValidationException(String message) { super(message); } }
編寫異常處理器
通過 BeanFactoryPostProcessor
統(tǒng)一攔截配置階段的校驗錯誤:
package com.icoderoad.demo.exception; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.boot.context.properties.bind.BindValidationException; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.ObjectError; import java.util.stream.Collectors; @Configuration public class ConfigValidationExceptionHandler { @Bean public static BeanFactoryPostProcessor configurationPropertiesValidator() { return beanFactory -> { try { // 手動觸發(fā)bean初始化 } catch (BeansException ex) { Throwable cause = ex.getCause(); if (cause instanceof BindValidationException bindValidationException) { String errorMessages = bindValidationException.getValidationErrors() .getAllErrors() .stream() .map(ObjectError::getDefaultMessage) .collect(Collectors.joining("; ")); throw new ConfigValidationException("配置屬性校驗失?。? + errorMessages); } throw ex; } }; } }
邏輯解釋:
- 捕獲
BindValidationException
- 提取所有校驗失敗信息
- 使用
;
拼接成簡潔可讀的文本 - 拋出我們的
ConfigValidationException
示例效果
比如你的配置錯誤如下:
app: user: username: "" email: "wrong" age: 15 address: city: "" zipCode: "12abc" roles: - ""
啟動時拋出的錯誤變成:
配置屬性校驗失?。河脩裘荒転榭? 郵箱格式不正確; 年齡不能小于18歲; 城市不能為空; 郵編必須是6位數(shù)字; 角色名稱不能為空
- 信息集中、簡潔直觀
- 一次性列出所有問題,快速修復(fù)
- 適合前后端、測試同事快速理解
總結(jié)
Spring Boot 3.4 配置屬性驗證:
- 驗證能力更強大覆蓋深度校驗、集合元素校驗
- 開發(fā)體驗更極致啟動即校驗,IDE智能提示
- 錯誤處理更優(yōu)雅可自定義異常格式
- 提升整體代碼質(zhì)量避免配置隱患上線
在實際項目中,推薦配合自定義異常機制,打造更加專業(yè)可靠的配置校驗體系!
到此這篇關(guān)于SpringBoot3.4配置校驗新特性的用法詳解的文章就介紹到這了,更多相關(guān)SpringBoot配置校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲
這篇文章主要為大家詳細(xì)介紹了Java如何基于面向?qū)ο髮崿F(xiàn)一個戰(zhàn)士小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-07-07Java設(shè)計模式之代理模式_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計模式之代理模式,本文詳細(xì)的介紹了什么事代理模式和相關(guān)的類和接口,有興趣的可以了解一下2017-08-08Spring Security整合Oauth2實現(xiàn)流程詳解
這篇文章主要介紹了Spring Security整合Oauth2實現(xiàn)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08eclipse/IDEA配置javafx項目步驟(圖文教程)
這篇文章主要介紹了eclipse/IDEA配置javafx項目步驟(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03