springboot的實(shí)體類字段校驗(yàn)的分組校驗(yàn)具體實(shí)現(xià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
字段:在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 ); } }
五、測(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ò) @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í)體類可能包含不同場(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)文章希望大家以后多多支持腳本之家!
- 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)文章
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-12Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問(wèn)題
這篇文章主要介紹了Springboot報(bào)錯(cuò)java.lang.NullPointerException: null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Springcloud seata nacos環(huán)境搭建過(guò)程圖解
這篇文章主要介紹了Springcloud seata nacos環(huán)境搭建過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03