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

2、對象參數(shù)校驗
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ù)驗證";
}
}
在Apifox上測試,會顯示錯誤信息

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

4、嵌套校驗
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ù)校驗";
}
}
在Apifox上測試,會顯示具體第幾個變量的哪幾個參數(shù)有錯誤

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

