SpringBoot參數(shù)校驗之@Valid與@Validated的用法與場景
在實際開發(fā)中,參數(shù)校驗是保證接口安全性和數(shù)據(jù)完整性的重要手段。Spring Boot提供了@Valid
和@Validated
兩個核心注解來實現(xiàn)參數(shù)校驗,但許多開發(fā)者對它們的區(qū)別和使用場景存在疑惑。本文將深入解析二者的差異,并通過代碼示例演示其具體應用場景。
一、核心注解對比
特性 | @Valid | @Validated |
---|---|---|
標準來源 | JSR-303/JSR-349規(guī)范(Java標準) | Spring框架擴展 |
作用范圍 | 方法參數(shù)、字段、嵌套對象 | 類、方法、參數(shù) |
分組校驗 | 不支持 | 支持 |
嵌套驗證 | 需配合@Valid 遞歸觸發(fā) | 需配合@Valid 遞歸觸發(fā) |
使用場景 | 簡單參數(shù)校驗 | 復雜校驗(分組、方法參數(shù)校驗) |
二、@Valid的用法與場景
1. 基本使用
@Valid
主要用于方法參數(shù)校驗,尤其在Controller層對DTO對象進行驗證。需配合JSR-303注解(如@NotNull
、@Size
)使用。
示例代碼:
@PostMapping("/users") public ResponseEntity<?> createUser(@RequestBody @Valid UserDTO userDTO) { // 業(yè)務邏輯 return ResponseEntity.ok().build(); } public class UserDTO { @NotBlank(message = "用戶名不能為空") private String username; @Size(min = 6, max = 20, message = "密碼長度需在6-20位") private String password; }
2. 嵌套驗證
若DTO中包含其他對象字段,需在字段上添加@Valid
觸發(fā)遞歸校驗。
public class OrderDTO { @Valid // 觸發(fā)嵌套校驗 private UserDTO user; @NotNull(message = "訂單金額不能為空") private BigDecimal amount; }
三、@Validated的進階特性
1. 分組校驗
場景說明:不同業(yè)務場景下,同一對象可能需要不同的校驗規(guī)則。例如,用戶注冊時需要驗證郵箱,而更新信息時不需要。
實現(xiàn)步驟:
定義分組接口:
public interface CreateGroup {} // 創(chuàng)建分組 public interface UpdateGroup {} // 更新分組
在DTO中指定分組:
public class UserDTO { @NotBlank(groups = CreateGroup.class, message = "郵箱不能為空") private String email; @NotBlank(message = "用戶名不能為空") private String username; }
在Controller中使用@Validated
激活分組:
@PostMapping("/users") public ResponseEntity<?> createUser( @RequestBody @Validated(CreateGroup.class) UserDTO userDTO) { // 僅校驗CreateGroup分組的規(guī)則 return ResponseEntity.ok().build(); }
2. 方法參數(shù)校驗
@Validated
可用于Service層的方法參數(shù)校驗,需在類上添加@Validated
注解。
@Service @Validated // 啟用方法參數(shù)校驗 public class UserService { public void updateUser(@NotBlank String username, @Min(1) Long userId) { // 業(yè)務邏輯 } }
四、嵌套驗證與分組校驗結(jié)合
復雜場景:在分組校驗中觸發(fā)嵌套對象的驗證。
public class OrderDTO { @Validated(CreateGroup.class) // 指定分組 @Valid private UserDTO user; @NotNull(message = "金額必填") private BigDecimal amount; } // Controller層 @PostMapping("/orders") public ResponseEntity<?> createOrder( @RequestBody @Validated(CreateGroup.class) OrderDTO orderDTO) { // 同時校驗OrderDTO和UserDTO中CreateGroup分組的規(guī)則 return ResponseEntity.ok().build(); }
五、常見問題與注意事項
1. 異常處理
校驗失敗會拋出以下異常:
MethodArgumentNotValidException
(@Valid觸發(fā))ConstraintViolationException
(@Validated觸發(fā))
統(tǒng)一異常處理示例:
@RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException ex) { Map<String, String> errors = new HashMap<>(); ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage())); return ResponseEntity.badRequest().body(errors); } }
2. 依賴問題
確保項目中引入spring-boot-starter-validation
:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
3. 注意事項
- Spring版本兼容性:低版本Spring需手動啟用
@EnableWebMvc
或@Validated
支持。 - 分組接口設計:分組接口建議定義為空接口,僅作為標識。
六、總結(jié)與最佳實踐
場景 | 推薦注解 |
---|---|
Controller層DTO參數(shù)校驗 | @Valid |
分組校驗 | @Validated + 分組接口 |
Service層方法參數(shù)校驗 | @Validated (類級別) |
嵌套對象遞歸校驗 | @Valid + @Validated 組合 |
最佳實踐:
- Controller層:優(yōu)先使用
@Valid
進行簡單校驗。 - 復雜業(yè)務校驗:使用
@Validated
的分組功能。 - Service層參數(shù)校驗:在類上添加
@Validated
,配合JSR-303注解。
以上就是SpringBoot中@Valid與@Validated的用法與場景的詳細內(nèi)容,更多關于SpringBoot中@Valid與@Validated的資料請關注腳本之家其它相關文章!
相關文章
如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫
MyBatis可以通過簡單的XML或者注解來配置和映射原始類型,接口,和Java POJO為數(shù)據(jù)庫中記錄,使用MyBatis幫助我們解決各種問題,本文介紹如何在Spring?Boot中使用MyBatis訪問數(shù)據(jù)庫,感興趣的朋友一起看看吧2023-11-11淺談Java中向上造型向下造型和接口回調(diào)中的問題
這篇文章主要介紹了淺談Java中向上造型向下造型和接口回調(diào)中的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08mybatis typeAliases 給實體類起別名的方法
這篇文章主要介紹了mybatis typeAliases 給實體類起別名,本文給大家分享兩種用法,通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09Spring Boot 編寫Servlet、Filter、Listener、Interceptor的方法
這篇文章給大家介紹了spring-boot中如何定義過濾器、監(jiān)聽器和攔截器,對Spring Boot 編寫Servlet、Filter、Listener、Interceptor的相關知識感興趣的朋友一起看看吧2017-07-07java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解
這篇文章主要介紹了java爬蟲之使用HttpClient模擬瀏覽器發(fā)送請求方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07