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

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

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

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

一、定義分組接口

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

// 新增時(shí)的校驗(yàn)分組
public interface CreateGroup {}
// 更新時(shí)的校驗(yàn)分組
public interface UpdateGroup {}

二、在實(shí)體類中指定分組

在字段的校驗(yàn)注解中,通過(guò) 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 = "密碼長(zhǎng)度需在6到20位之間", groups = {CreateGroup.class, UpdateGroup.class})
    private String password;
    // 省略Getter和Setter
}
  • id 字段:僅在 UpdateGroup 分組下校驗(yàn)(更新時(shí)必須校驗(yàn))。
  • username 字段:僅在 CreateGroup 分組下校驗(yàn)(新增時(shí)必須校驗(yàn))。
  • password 字段:在 CreateGroupUpdateGroup 分組下均校驗(yàn)(新增和更新時(shí)都校驗(yàn))。

三、在Controller中指定校驗(yàn)分組

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

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

四、全局異常處理

分組校驗(yàn)失敗會(huì)拋出 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ù)校驗(yàn)失敗",
            "data", errors
        );
    }
}

五、測(cè)試示例 

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

請(qǐng)求:

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

響應(yīng):

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

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

請(qǐng)求:

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

響應(yīng):

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

六、分組校驗(yàn)的高級(jí)用法

1. 多分組組合校驗(yàn)

可以在 @Validated 中同時(shí)指定多個(gè)分組:

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

2. 默認(rèn)分組

如果字段未指定 groups 屬性,則默認(rèn)屬于 Default 分組??梢酝ㄟ^(guò) @Validatedvalue 屬性同時(shí)包含默認(rèn)分組:

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

3. 繼承分組

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

public interface AdvancedGroup extends CreateGroup {}

七、分組校驗(yàn) vs 多個(gè)DTO

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

總結(jié)

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

    Java8中Stream的使用方式

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

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

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

    response對(duì)象的使用(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇response對(duì)象的使用(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問(wèn)題

    Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問(wèn)題

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

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

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

    Java反射獲取實(shí)例的速度對(duì)比分析

    這篇文章主要介紹了Java反射獲取實(shí)例的速度對(duì)比分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • 一文掌握J(rèn)ava中的JWT

    一文掌握J(rèn)ava中的JWT

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

最新評(píng)論