springboot的實(shí)體類(lèi)字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟
分組校驗(yàn)(Group Validation)允許在不同的場(chǎng)景下對(duì)同一個(gè)實(shí)體類(lèi)應(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í)體類(lèi)中指定分組
在字段的校驗(yàn)注解中,通過(guò) groups 屬性指定所屬分組:
public class User {
@NotBlank(message = "用戶(hù)ID不能為空", groups = UpdateGroup.class)
private String id;
@NotBlank(message = "用戶(hù)名不能為空", 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字段:在CreateGroup和UpdateGroup分組下均校驗(yàn)(新增和更新時(shí)都校驗(yàn))。
三、在Controller中指定校驗(yàn)分組
在Controller方法參數(shù)上使用 @Validated 注解(注意是 Spring 的注解,而非 @Valid),并指定分組:
@RestController
public class UserController {
// 新增用戶(hù)(校驗(yàn) CreateGroup 分組)
@PostMapping("/users")
public String createUser(@Validated(CreateGroup.class) @RequestBody User user) {
return "用戶(hù)新增成功";
}
// 更新用戶(hù)(校驗(yàn) UpdateGroup 分組)
@PutMapping("/users/{id}")
public String updateUser(@Validated(UpdateGroup.class) @RequestBody User user) {
return "用戶(hù)更新成功";
}
}四、全局異常處理
分組校驗(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. 新增用戶(hù)(觸發(fā) CreateGroup 分組校驗(yàn))
請(qǐng)求:
POST /users
Content-Type: application/json
{
"password": "12345"
}響應(yīng):
{
"code": 400,
"message": "參數(shù)校驗(yàn)失敗",
"data": {
"username": "用戶(hù)名不能為空",
"password": "密碼長(zhǎng)度需在6到20位之間"
}
}2. 更新用戶(hù)(觸發(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": "用戶(hù)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ò) @Validated 的 value 屬性同時(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í)體類(lèi)可能包含不同場(chǎng)景的注解 |
| 多個(gè)DTO | 職責(zé)單一,結(jié)構(gòu)清晰 | 需要維護(hù)多個(gè)DTO類(lèi) |
總結(jié)
通過(guò)分組校驗(yàn),可以靈活控制不同場(chǎng)景下的校驗(yàn)規(guī)則,避免為每個(gè)場(chǎng)景創(chuàng)建單獨(dú)的DTO類(lèi)。關(guān)鍵步驟:
定義分組接口。在實(shí)體類(lèi)字段的校驗(yàn)注解中指定 groups。在Controller方法參數(shù)上使用 @Validated(分組.class)。全局捕獲 ConstraintViolationException 并返回自定義錯(cuò)誤。
到此這篇關(guān)于springboot的實(shí)體類(lèi)字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)springboot分組校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)
- SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過(guò)程詳解
- SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
- SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進(jìn)行參數(shù)校驗(yàn)
- springboot @validated List校驗(yàn)失效問(wèn)題
- springboot使用@Validated或@Valid注解校驗(yàn)參數(shù)方式
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
相關(guān)文章
手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法
這篇文章主要介紹了手動(dòng)添加jar包進(jìn)Maven本地庫(kù)內(nèi)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
下面這篇文章主要給大家介紹了關(guān)于Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器的相關(guān)資料,這是一個(gè)關(guān)于java簡(jiǎn)單計(jì)算器的完整課程設(shè)計(jì)以及源碼,需要的朋友可以參考下2023-06-06
關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理
這篇文章主要介紹了關(guān)于SpringBoot使用@ExceptionHandler注解局部異常處理,SpringBoot提供了多種方式來(lái)處理異常,在本文中,我們將介紹SpringBoot中的@ExceptionHandler注解,演示如何使用它進(jìn)行局部異常處理2023-07-07
Java實(shí)現(xiàn)數(shù)字金額轉(zhuǎn)換為中文大寫(xiě)金額的完整指南與優(yōu)化技巧
在金融、財(cái)務(wù)和商務(wù)系統(tǒng)中,將數(shù)字金額轉(zhuǎn)換為中文大寫(xiě)金額是一項(xiàng)常見(jiàn)需求,中文大寫(xiě)金額能有效避免篡改和歧義,是合同、發(fā)票等正式場(chǎng)景的規(guī)范要求,本文將通過(guò)Java實(shí)現(xiàn)這一功能,需要的朋友可以參考下2025-12-12
java控制臺(tái)實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(集合版)
這篇文章主要為大家詳細(xì)介紹了java控制臺(tái)實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的集合版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
idea手動(dòng)導(dǎo)入了包但編譯運(yùn)行還是報(bào)找不到xxx.jar包的解決方案
這篇文章主要介紹了idea手動(dòng)導(dǎo)入了包但編譯運(yùn)行還是報(bào)找不到xxx.jar包的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
Java8 Stream API 詳細(xì)使用方法與操作技巧指南
這篇文章主要介紹了Java8 Stream API 詳細(xì)使用方法與操作技巧,總結(jié)分析了Java8 Stream API 基本功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05

