最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用validator分組校驗(yàn)實(shí)現(xiàn)方式

 更新時(shí)間:2025年11月25日 14:57:06   作者:shy好好學(xué)習(xí)  
本文詳細(xì)介紹了在SpringBoot中使用分組校驗(yàn)進(jìn)行數(shù)據(jù)驗(yàn)證的兩種方法:使用@Validated注解在控制器層進(jìn)行校驗(yàn)和使用ValidateUtil工具類在任意位置進(jìn)行手動(dòng)校驗(yàn),通過合理使用驗(yàn)證組和驗(yàn)證方法,可以確保數(shù)據(jù)的正確性和一致性,提高應(yīng)用程序的健壯性和安全性

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)的兩種主要方法:

  1. 使用@Validated注解在控制器層進(jìn)行校驗(yàn)
  2. 使用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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解SpringBoot構(gòu)建的Web項(xiàng)目如何在服務(wù)端校驗(yà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的方法講解

    Spring通過ApplicationContext主動(dòng)獲取bean的方法講解

    今天小編就為大家分享一篇關(guān)于Spring通過ApplicationContext主動(dòng)獲取bean的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例

    java中字符串與日期的轉(zhuǎn)換實(shí)例,需要的朋友可以參考一下
    2013-05-05
  • JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用

    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局部刷新分頁方法

    下面小編就為大家分享一篇springMVC+velocity實(shí)現(xiàn)仿Datatables局部刷新分頁方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Springboot錯(cuò)誤頁面和錯(cuò)誤信息定制操作

    Springboot錯(cuò)誤頁面和錯(cuò)誤信息定制操作

    這篇文章主要介紹了Springboot錯(cuò)誤頁面和錯(cuò)誤信息定制操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于SpringBoot+FFmpeg+ZLMediaKit實(shí)現(xiàn)本地視頻推流

    基于SpringBoot+FFmpeg+ZLMediaKit實(shí)現(xiàn)本地視頻推流

    文章介紹了如何在服務(wù)器上安裝和配置ZLMediaKit和FFmpeg,以及如何使用SpringBoot實(shí)現(xiàn)視頻推流和播放功能,包括環(huán)境準(zhǔn)備、后端實(shí)現(xiàn)和使用說明,涵蓋了推流和播放的完整流程,需要的朋友可以參考下
    2025-11-11
  • Java實(shí)現(xiàn)插入排序

    Java實(shí)現(xiàn)插入排序

    這篇文章主要介紹了Java實(shí)現(xiàn)插入排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • springboot 配置日志 打印不出來sql的解決方法

    springboot 配置日志 打印不出來sql的解決方法

    這篇文章主要介紹了springboot 配置日志 打印不出來sql的解決方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2020-11-11
  • MyBatis-Plus高效開發(fā)實(shí)戰(zhàn)指南

    MyBatis-Plus高效開發(fā)實(shí)戰(zhàn)指南

    MyBatis-Plus(簡稱?MP)是?個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā),本文介紹MyBatis-Plus高效開發(fā)全攻略,感興趣的朋友跟隨小編一起看看吧
    2026-03-03

最新評(píng)論

河曲县| 木兰县| 建昌县| 呼玛县| 崇文区| 灵台县| 大理市| 拉萨市| 岢岚县| 杭锦后旗| 昔阳县| 陆河县| 寿光市| 从化市| 张家港市| 扶绥县| 当雄县| 凭祥市| 太仆寺旗| 恩施市| 定南县| 东平县| 凌海市| 高清| 宜城市| 广南县| 自贡市| 淮滨县| 广宁县| 定安县| 萨迦县| 西乡县| 年辖:市辖区| 山东省| 大城县| 洛南县| 乌拉特前旗| 星子县| 河曲县| 木兰县| 栖霞市|