SpringBoot使用validator分組校驗(yàn)實(shí)現(xiàn)方式
1. 簡介
在SpringBoot應(yīng)用程序中,數(shù)據(jù)驗(yàn)證是確保應(yīng)用程序健壯性和安全性的關(guān)鍵環(huán)節(jié)。
Spring Validator提供了強(qiáng)大的驗(yàn)證功能,而分組校驗(yàn)則允許我們根據(jù)不同的場景對同一個(gè)對象進(jìn)行不同的驗(yàn)證。
本文將詳細(xì)介紹如何在SpringBoot中使用validator完成分組校驗(yàn),包括兩種主要的實(shí)現(xiàn)方法。
2. 環(huán)境準(zhǔn)備
2.1 依賴配置
首先,確保你的項(xiàng)目中包含了必要的依賴。在pom.xml文件中添加以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.2 定義驗(yàn)證組
創(chuàng)建接口來定義不同的驗(yàn)證組:
public interface Create {}
public interface Update {}
3. 創(chuàng)建實(shí)體類
使用注解來定義帶有分組的驗(yàn)證規(guī)則:
import javax.validation.constraints.*;
public class User {
@NotNull(groups = {Create.class, Update.class})
private Long id;
@NotBlank(groups = Create.class)
@Size(min = 4, max = 20, groups = {Create.class, Update.class})
private String username;
@NotBlank(groups = Create.class)
@Size(min = 6, max = 20, groups = {Create.class, Update.class})
private String password;
@Min(value = 18, groups = Create.class)
private int age;
@Email(groups = {Create.class, Update.class})
private String email;
// getters and setters
}
4. 實(shí)現(xiàn)分組校驗(yàn)
4.1 方法一:使用@Validated注解
4.1.1 創(chuàng)建控制器
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@Validated(Create.class) @RequestBody User user) {
// 處理用戶創(chuàng)建邏輯
return "User created successfully";
}
@PutMapping
public String updateUser(@Validated(Update.class) @RequestBody User user) {
// 處理用戶更新邏輯
return "User updated successfully";
}
}
4.1.2 全局異常處理
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}
4.2 方法二:使用ValidateUtil
4.2.1 創(chuàng)建ValidateUtil
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
import java.util.stream.Collectors;
public class ValidateUtil {
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
public static <T> void validate(T obj, Class<?>... groups) {
Set<ConstraintViolation<T>> violations = validator.validate(obj, groups);
if (!violations.isEmpty()) {
throw new ValidationException(violations.stream()
.map(v -> v.getPropertyPath() + ": " + v.getMessage())
.collect(Collectors.joining(", ")));
}
}
public static class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}
}
4.2.2 在服務(wù)層使用ValidateUtil
@Service
public class UserService {
public void createUser(User user) {
ValidateUtil.validate(user, Create.class);
// 繼續(xù)處理用戶創(chuàng)建邏輯
}
public void updateUser(User user) {
ValidateUtil.validate(user, Update.class);
// 繼續(xù)處理用戶更新邏輯
}
}
4.2.3 處理ValidationException
在全局異常處理器中添加:
@ControllerAdvice
public class GlobalExceptionHandler {
// ... 之前的代碼 ...
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(ValidateUtil.ValidationException.class)
public Map<String, String> handleValidationException(ValidateUtil.ValidationException ex) {
Map<String, String> errors = new HashMap<>();
errors.put("error", ex.getMessage());
return errors;
}
}
5. 比較兩種校驗(yàn)方式
使用@Validated注解:
- 優(yōu)點(diǎn):與Spring MVC集成緊密,自動(dòng)處理驗(yàn)證邏輯
- 缺點(diǎn):僅限于控制器層使用
使用ValidateUtil.validate():
- 優(yōu)點(diǎn):可以在任何層(如服務(wù)層)使用,更加靈活
- 缺點(diǎn):需要手動(dòng)調(diào)用驗(yàn)證方法
6. 測試
使用Postman或其他API測試工具來測試你的API:
創(chuàng)建用戶時(shí),所有字段都必須填寫,且符合相應(yīng)的規(guī)則。

更新用戶時(shí),id是必須的,但其他字段可以選填,只要填寫了就必須符合規(guī)則。

7. 總結(jié)
本文介紹了在SpringBoot中實(shí)現(xiàn)分組校驗(yàn)的兩種主要方法:
- 使用
@Validated注解在控制器層進(jìn)行校驗(yàn) - 使用
ValidateUtil工具類在任意位置進(jìn)行手動(dòng)校驗(yàn)
這兩種方法各有優(yōu)勢,可以根據(jù)具體的業(yè)務(wù)需求選擇使用。通過合理使用驗(yàn)證組和驗(yàn)證方法,我們可以:
- 確保數(shù)據(jù)的正確性和一致性
- 提高應(yīng)用程序的健壯性和安全性
- 根據(jù)不同的業(yè)務(wù)場景靈活應(yīng)用驗(yàn)證規(guī)則
- 在早期發(fā)現(xiàn)和處理潛在的問題
在實(shí)際開發(fā)中,建議根據(jù)項(xiàng)目的架構(gòu)和需求,選擇合適的驗(yàn)證策略。良好的驗(yàn)證實(shí)踐不僅可以提高代碼質(zhì)量,還能增強(qiáng)用戶體驗(yàn),是構(gòu)建可靠軟件系統(tǒng)的關(guān)鍵環(huán)節(jié)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot如何使用validator框架優(yōu)雅地校驗(yàn)參數(shù)
- Springboot項(xiàng)目參數(shù)校驗(yàn)方式(Validator)
- springboot中使用ConstraintValidatorContext驗(yàn)證兩個(gè)字段內(nèi)容相同
- Springboot整合hibernate validator 全局異常處理步驟詳解
- SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))
- SpringBoot參數(shù)校驗(yàn)Validator框架詳解
相關(guān)文章
詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入
這篇文章主要介紹了詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yàn)表單輸入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Spring通過ApplicationContext主動(dòng)獲取bean的方法講解
今天小編就為大家分享一篇關(guān)于Spring通過ApplicationContext主動(dòng)獲取bean的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用
本文主要介紹了JAVA匿名內(nèi)部類,匿名內(nèi)部類在我們JAVA程序員的日常工作中經(jīng)常要用到,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
springMVC+velocity實(shí)現(xiàn)仿Datatables局部刷新分頁方法
下面小編就為大家分享一篇springMVC+velocity實(shí)現(xiàn)仿Datatables局部刷新分頁方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Springboot錯(cuò)誤頁面和錯(cuò)誤信息定制操作
這篇文章主要介紹了Springboot錯(cuò)誤頁面和錯(cuò)誤信息定制操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
基于SpringBoot+FFmpeg+ZLMediaKit實(shí)現(xiàn)本地視頻推流
文章介紹了如何在服務(wù)器上安裝和配置ZLMediaKit和FFmpeg,以及如何使用SpringBoot實(shí)現(xiàn)視頻推流和播放功能,包括環(huán)境準(zhǔn)備、后端實(shí)現(xiàn)和使用說明,涵蓋了推流和播放的完整流程,需要的朋友可以參考下2025-11-11
MyBatis-Plus高效開發(fā)實(shí)戰(zhàn)指南
MyBatis-Plus(簡稱?MP)是?個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā),本文介紹MyBatis-Plus高效開發(fā)全攻略,感興趣的朋友跟隨小編一起看看吧2026-03-03

