SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
一、什么是參數(shù)校驗(yàn)
例如在某個(gè)登錄請求中傳遞參數(shù)包含用戶信息,需要判斷用戶信息是否為空,以及判斷郵箱是否為空等情況,正常處理會寫大量的If else 語句非常影響美觀,可讀性也非常低,因此提出了參數(shù)校驗(yàn)這個(gè)概念,也就是下文介紹的@Valid和@Validated注解
@Controller
@RequestMapping("/user")
public class UserControlelr {
@PostMapping("/login")
public String login(UserDTO userDTO){
if (userDTO.getUsername() == null || userDTO.getUsername().isEmpty()){
// 進(jìn)行某種操作
}
if(userDTO.getEmail() == null || userDTO.getEmail().isEmpty()){
// 進(jìn)行某種操作
}
return "loginSuccess";
}
}
二、@Valid和@Validated注解的異同
標(biāo)注位置
- @Validated : 用在類、方法和方法參數(shù)上,但不能用于成員屬性。
- @Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性上。
分組校驗(yàn)
- @Validated :支持分組驗(yàn)證,可以更細(xì)致地控制驗(yàn)證過程。
- @Valid:主要支持標(biāo)準(zhǔn)的Bean驗(yàn)證功能,不支持分組驗(yàn)證。
嵌套校驗(yàn)
- @Validated :不支持嵌套驗(yàn)證。
- @Valid:支持嵌套驗(yàn)證,可以嵌套驗(yàn)證對象內(nèi)部的屬性。
三、常用校驗(yàn)注解
| 注解 | 校驗(yàn)作用 |
|---|---|
| @NotBlank | 用在String 上面,一般用來校驗(yàn)String類型不能為空,而且調(diào)用trim()后,長度必須大于0。 |
| @NotEmpty | 用在集合上面,一般用來校驗(yàn)List類型(不能注釋枚舉),而且長度必須大于0 |
| @NotNull | 驗(yàn)證字段不為 null。一般用于數(shù)字類型。 |
| @Min(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
| @Max(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
| @past | 限制元素(日期類型)必須是一個(gè)過去的日期 |
| @Future | 限制元素(日期類型)必須是一個(gè)將來的日期 |
| 限制的元素值為是電子郵件地址 | |
| @Patern(value) | 限制必須符合指定的正則表達(dá)式 |
四、如何使用
1、普通參數(shù)校驗(yàn)
即直接檢驗(yàn)像String、Interger這些普通參數(shù)
注意,要在controller上加入@Validated注解才能生效
@RestController
@Validated
public class Test1Controller {
@PostMapping("/test1")
public String test1(@NotEmpty String username, @Max(5) Integer value){
return "校驗(yàn)普通參數(shù)";
}
在Apifox上測試,會顯示錯(cuò)誤信息

2、對象參數(shù)校驗(yàn)
UserDTO.java
@Data
public class UserDTO {
/**
* 用戶名
*/
@NotBlank
private String username;
/**
* 密碼
*/
@NotBlank
private String pasword;
/**
* 郵箱
*/
@Email
private String email;
}
在參數(shù)的DTO上加入@Valid和@Validated效果是一樣的
@RestController
public class Test2Controller {
@PostMapping("/test2")
public String test2(@Valid @RequestBody UserDTO userDTO){
return "對象參數(shù)驗(yàn)證";
}
}
在Apifox上測試,會顯示錯(cuò)誤信息

3、集合參數(shù)校驗(yàn)
注意,要在controller上加入@Validated注解才能生效
@RestController
@Validated
public class Test3Controller {
@PostMapping("/test3")
public String test3(@Valid @RequestBody List<UserDTO> userDTOList){
return "集合參數(shù)校驗(yàn)";
}
}
在Apifox上測試,會顯示具體第幾個(gè)變量的哪幾個(gè)參數(shù)有錯(cuò)誤

4、嵌套校驗(yàn)
UserListDTO.java
@Data
public class UserListDTO {
/**
* List的name
*/
@NotBlank
private String listName;
/**
* User列表
*/
@Valid
private List<UserDTO> userDTOList;
}
@RestController
public class Test4Controller {
@PostMapping("/test4")
public String test4(@Validated @RequestBody UserListDTO userListDTO){
return "嵌套參數(shù)校驗(yàn)";
}
}
在Apifox上測試,會顯示具體第幾個(gè)變量的哪幾個(gè)參數(shù)有錯(cuò)誤

以上就是SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot @Valid和@Validated參數(shù)校驗(yàn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式
這篇文章主要介紹了sprintboot使用spring-security包,緩存內(nèi)存與redis共存方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)計(jì)全局接口訪問次數(shù)詳解
這篇文章主要介紹了SpringBoot通過AOP實(shí)現(xiàn)對全局接口訪問次數(shù)的統(tǒng)計(jì),文章從相關(guān)問題展開全文內(nèi)容詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
JAVA使用動態(tài)代理對象進(jìn)行敏感字過濾代碼實(shí)例
這篇文章主要介紹了JAVA使用動態(tài)代理對象進(jìn)行敏感字過濾代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建
這篇文章主要介紹了詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
詳解spring boot jpa整合QueryDSL來簡化復(fù)雜操作
這篇文章主要介紹了詳解spring boot jpa整合QueryDSL來簡化復(fù)雜操作,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
通過實(shí)例解析POJO和JavaBean的區(qū)別
這篇文章主要介紹了通過實(shí)例解析POJO和JavaBean的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07

