springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xiàn)步驟
分組校驗(yàn)(Group Validation)允許在不同的場景下對同一個(gè)實(shí)體類應(yīng)用不同的校驗(yàn)規(guī)則。例如,在新增數(shù)據(jù)和更新數(shù)據(jù)時(shí),可能需要對某些字段的校驗(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)注解中,通過 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分組下校驗(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 {
// 新增用戶(校驗(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
);
}
}五、測試示例
1. 新增用戶(觸發(fā) CreateGroup 分組校驗(yàn))
請求:
POST /users
Content-Type: application/json
{
"password": "12345"
}響應(yīng):
{
"code": 400,
"message": "參數(shù)校驗(yàn)失敗",
"data": {
"username": "用戶名不能為空",
"password": "密碼長度需在6到20位之間"
}
}2. 更新用戶(觸發(fā) UpdateGroup 分組校驗(yàn))
請求:
PUT /users/123
Content-Type: application/json
{
"password": "12345"
}響應(yīng):
{
"code": 400,
"message": "參數(shù)校驗(yàn)失敗",
"data": {
"id": "用戶ID不能為空",
"password": "密碼長度需在6到20位之間"
}
}六、分組校驗(yàn)的高級用法
1. 多分組組合校驗(yàn)
可以在 @Validated 中同時(shí)指定多個(gè)分組:
@Validated({CreateGroup.class, AnotherGroup.class})2. 默認(rèn)分組
如果字段未指定 groups 屬性,則默認(rèn)屬于 Default 分組??梢酝ㄟ^ @Validated 的 value 屬性同時(shí)包含默認(rèn)分組:
@Validated(value = {UpdateGroup.class, Default.class})3. 繼承分組
分組接口可以繼承其他接口,形成層級關(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í)體類可能包含不同場景的注解 |
| 多個(gè)DTO | 職責(zé)單一,結(jié)構(gòu)清晰 | 需要維護(hù)多個(gè)DTO類 |
總結(jié)
通過分組校驗(yàn),可以靈活控制不同場景下的校驗(yàn)規(guī)則,避免為每個(gè)場景創(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot實(shí)現(xiàn)各種參數(shù)校驗(yàn)總結(jié)(建議收藏!)
- SpringBoot實(shí)現(xiàn)License生成和校驗(yàn)的過程詳解
- SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
- SpringBoot使用@NotEmpty、@NotBlank、@NotNull注解進(jìn)行參數(shù)校驗(yàn)
- springboot @validated List校驗(yàn)失效問題
- springboot使用@Validated或@Valid注解校驗(yàn)參數(shù)方式
- SpringBoot使用Validation包進(jìn)行輸入?yún)?shù)校驗(yàn)
相關(guān)文章
Java Swing SpringLayout彈性布局的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java Swing SpringLayout彈性布局的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問題
這篇文章主要介紹了Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Springcloud seata nacos環(huán)境搭建過程圖解
這篇文章主要介紹了Springcloud seata nacos環(huán)境搭建過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

