欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot的實體類字段校驗的分組校驗具體實現(xiàn)步驟

 更新時間:2025年03月11日 11:21:30   作者:Su米蘇  
分組校驗允許在不同場景下對同一實體類應(yīng)用不同的校驗規(guī)則,通過定義分組接口、在實體類和Controller中指定分組,以及全局異常處理,可以靈活控制校驗規(guī)則,本文介紹springboot的實體類字段校驗的分組校驗,感興趣的朋友一起看看吧

分組校驗(Group Validation)允許在不同的場景下對同一個實體類應(yīng)用不同的校驗規(guī)則。例如,在新增數(shù)據(jù)更新數(shù)據(jù)時,可能需要對某些字段的校驗規(guī)則進行調(diào)整。以下是分組校驗的具體實現(xiàn)步驟:

一、定義分組接口

創(chuàng)建空的標記接口(僅用于分組標識):

// 新增時的校驗分組
public interface CreateGroup {}
// 更新時的校驗分組
public interface UpdateGroup {}

二、在實體類中指定分組

在字段的校驗注解中,通過 groups 屬性指定所屬分組:

public class User {
    @NotBlank(message = "用戶ID不能為空", groups = UpdateGroup.class)
    private String id;
    @NotBlank(message = "用戶名不能為空", groups = CreateGroup.class)
    private String username;
    @Size(min = 6, max = 20, message = "密碼長度需在6到20位之間", groups = {CreateGroup.class, UpdateGroup.class})
    private String password;
    // 省略Getter和Setter
}
  • id 字段:僅在 UpdateGroup 分組下校驗(更新時必須校驗)。
  • username 字段:僅在 CreateGroup 分組下校驗(新增時必須校驗)。
  • password 字段:在 CreateGroupUpdateGroup 分組下均校驗(新增和更新時都校驗)。

三、在Controller中指定校驗分組

在Controller方法參數(shù)上使用 @Validated 注解(注意是 Spring 的注解,而非 @Valid),并指定分組:

@RestController
public class UserController {
    // 新增用戶(校驗 CreateGroup 分組)
    @PostMapping("/users")
    public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {
        return "用戶新增成功";
    }
    // 更新用戶(校驗 UpdateGroup 分組)
    @PutMapping("/users/{id}")
    public String updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {
        return "用戶更新成功";
    }
}

四、全局異常處理

分組校驗失敗會拋出 ConstraintViolationException,需在全局異常處理器中捕獲:

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public Map<String, Object> handleConstraintViolationException(ConstraintViolationException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getConstraintViolations().forEach(violation -> {
            String field = violation.getPropertyPath().toString();
            String message = violation.getMessage();
            errors.put(field, message);
        });
        return Map.of(
            "code", HttpStatus.BAD_REQUEST.value(),
            "message", "參數(shù)校驗失敗",
            "data", errors
        );
    }
}

五、測試示例 

1. 新增用戶(觸發(fā) CreateGroup 分組校驗)

請求:

POST /users
Content-Type: application/json
{
    "password": "12345"
}

響應(yīng):

{
    "code": 400,
    "message": "參數(shù)校驗失敗",
    "data": {
        "username": "用戶名不能為空",
        "password": "密碼長度需在6到20位之間"
    }
}

2. 更新用戶(觸發(fā) UpdateGroup 分組校驗)

請求:

PUT /users/123
Content-Type: application/json
{
    "password": "12345"
}

響應(yīng):

{
    "code": 400,
    "message": "參數(shù)校驗失敗",
    "data": {
        "id": "用戶ID不能為空",
        "password": "密碼長度需在6到20位之間"
    }
}

六、分組校驗的高級用法

1. 多分組組合校驗

可以在 @Validated 中同時指定多個分組:

@Validated({CreateGroup.class, AnotherGroup.class})

2. 默認分組

如果字段未指定 groups 屬性,則默認屬于 Default 分組??梢酝ㄟ^ @Validatedvalue 屬性同時包含默認分組:

@Validated(value = {UpdateGroup.class, Default.class})

3. 繼承分組

分組接口可以繼承其他接口,形成層級關(guān)系:

public interface AdvancedGroup extends CreateGroup {}

七、分組校驗 vs 多個DTO

方案優(yōu)點缺點
分組校驗避免創(chuàng)建多個相似DTO,減少冗余代碼實體類可能包含不同場景的注解
多個DTO職責單一,結(jié)構(gòu)清晰需要維護多個DTO類

總結(jié)

通過分組校驗,可以靈活控制不同場景下的校驗規(guī)則,避免為每個場景創(chuàng)建單獨的DTO類。關(guān)鍵步驟:

定義分組接口。在實體類字段的校驗注解中指定 groups。在Controller方法參數(shù)上使用 @Validated(分組.class)。全局捕獲 ConstraintViolationException 并返回自定義錯誤。

到此這篇關(guān)于springboot的實體類字段校驗的分組校驗具體實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)springboot分組校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java學(xué)生信息管理系統(tǒng)源代碼

    java學(xué)生信息管理系統(tǒng)源代碼

    這篇文章主要為大家詳細介紹了java學(xué)生信息管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解SpringMVC從基礎(chǔ)到源碼

    詳解SpringMVC從基礎(chǔ)到源碼

    這篇文章主要介紹了詳解SpringMVC從基礎(chǔ)到源碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • C++ 虛函數(shù)與純虛函數(shù)代碼詳解

    C++ 虛函數(shù)與純虛函數(shù)代碼詳解

    本文主要介紹了C++ 虛函數(shù)與純虛函數(shù)的使用與區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    這篇文章主要介紹了Java8中Stream的使用方式,文章通過Stream的創(chuàng)建展開詳細的介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • Java Swing SpringLayout彈性布局的實現(xiàn)代碼

    Java Swing SpringLayout彈性布局的實現(xiàn)代碼

    這篇文章主要介紹了Java Swing SpringLayout彈性布局的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • response對象的使用(實例講解)

    response對象的使用(實例講解)

    下面小編就為大家?guī)硪黄猺esponse對象的使用(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Springboot報錯java.lang.NullPointerException: null問題

    Springboot報錯java.lang.NullPointerException: null問題

    這篇文章主要介紹了Springboot報錯java.lang.NullPointerException: null問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Springcloud seata nacos環(huán)境搭建過程圖解

    Springcloud seata nacos環(huán)境搭建過程圖解

    這篇文章主要介紹了Springcloud seata nacos環(huán)境搭建過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java反射獲取實例的速度對比分析

    Java反射獲取實例的速度對比分析

    這篇文章主要介紹了Java反射獲取實例的速度對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 一文掌握Java中的JWT

    一文掌握Java中的JWT

    這篇文章主要介紹了Java中的JWT,JWT的本質(zhì)就是一個字符串,它是將用戶信息保存到一個Json字符串中,然后進行編碼后得到一個JWT?token,對JWT相關(guān)知識感興趣的朋友一起看看吧
    2022-06-06

最新評論