SpringBoot使用validator分組校驗(yàn)實(shí)現(xiàn)方式
1. 簡(jiǎn)介
在SpringBoot應(yīng)用程序中,數(shù)據(jù)驗(yàn)證是確保應(yīng)用程序健壯性和安全性的關(guān)鍵環(huán)節(jié)。
Spring Validator提供了強(qiáng)大的驗(yàn)證功能,而分組校驗(yàn)則允許我們根據(jù)不同的場(chǎng)景對(duì)同一個(gè)對(duì)象進(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)建接口來(lái)定義不同的驗(yàn)證組:
public interface Create {}
public interface Update {}
3. 創(chuàng)建實(shí)體類
使用注解來(lái)定義帶有分組的驗(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. 測(cè)試
使用Postman或其他API測(cè)試工具來(lái)測(cè)試你的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)勢(shì),可以根據(jù)具體的業(yè)務(wù)需求選擇使用。通過(guò)合理使用驗(yàn)證組和驗(yàn)證方法,我們可以:
- 確保數(shù)據(jù)的正確性和一致性
- 提高應(yīng)用程序的健壯性和安全性
- 根據(jù)不同的業(yè)務(wù)場(chǎng)景靈活應(yīng)用驗(yàn)證規(guī)則
- 在早期發(fā)現(xiàn)和處理潛在的問(wè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)文章
java?Springboot對(duì)接開發(fā)微信支付詳細(xì)流程
最近要做一個(gè)微信小程序,需要微信支付,所以研究了下怎么在java上集成微信支付功能,下面這篇文章主要給大家介紹了關(guān)于java?Springboot對(duì)接開發(fā)微信支付的相關(guān)資料,需要的朋友可以參考下2024-08-08
java實(shí)現(xiàn)圖片任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
Dom4j解析XML_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Dom4j解析XML,dom4j是一個(gè)Java的XML API,類似于jdom,用來(lái)讀寫XML文件的,有興趣的可以了解一下2017-07-07
SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊
這篇文章主要為大家詳細(xì)介紹了SpringBoot的WebSocket實(shí)現(xiàn)單聊群聊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02
java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn)
這篇文章主要介紹了java8 stream 操作map根據(jù)key或者value排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Spring?Boot使用線程池處理上萬(wàn)條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬(wàn)條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個(gè)線程池的配置,讓Spring Boot加載,用來(lái)定義如何創(chuàng)建一個(gè)ThreadPoolTaskExecutor,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08

