SpringBoot中利用@Valid和@Validated進(jìn)行參數(shù)校驗(yàn)
一、什么是參數(shù)校驗(yàn)
例如在某個登錄請求中傳遞參數(shù)包含用戶信息,需要判斷用戶信息是否為空,以及判斷郵箱是否為空等情況,正常處理會寫大量的If else 語句非常影響美觀,可讀性也非常低,因此提出了參數(shù)校驗(yàn)這個概念,也就是下文介紹的@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) | 限制必須為一個不小于指定值的數(shù)字 |
@Max(value) | 限制必須為一個不大于指定值的數(shù)字 |
@past | 限制元素(日期類型)必須是一個過去的日期 |
@Future | 限制元素(日期類型)必須是一個將來的日期 |
限制的元素值為是電子郵件地址 | |
@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上測試,會顯示錯誤信息
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上測試,會顯示錯誤信息
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上測試,會顯示具體第幾個變量的哪幾個參數(shù)有錯誤
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上測試,會顯示具體第幾個變量的哪幾個參數(shù)有錯誤
以上就是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共存方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot使用AOP實(shí)現(xiàn)統(tǒng)計(jì)全局接口訪問次數(shù)詳解
這篇文章主要介紹了SpringBoot通過AOP實(shí)現(xiàn)對全局接口訪問次數(shù)的統(tǒng)計(jì),文章從相關(guān)問題展開全文內(nèi)容詳情,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06JAVA使用動態(tài)代理對象進(jìn)行敏感字過濾代碼實(shí)例
這篇文章主要介紹了JAVA使用動態(tài)代理對象進(jìn)行敏感字過濾代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建
這篇文章主要介紹了詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01詳解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