SpringBoot學(xué)習(xí)篇之@Valid與@Validated的區(qū)別
1.介紹
說明: 其實(shí)@Valid 與 @Validated都是做數(shù)據(jù)校驗(yàn)的,只不過注解位置與用法有點(diǎn)不同。
不同點(diǎn):
(1)
@Valid是使用Hibernate validation的時(shí)候使用。@Validated是只用Spring Validator校驗(yàn)機(jī)制使用。
(2)
@Valid 可以嵌套驗(yàn)證
@Validation 不能進(jìn)行嵌套驗(yàn)證
(3)
@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(field)上。
@Validated:用在類、方法和方法參數(shù)上。但不能用于成員屬性(field)。
(如果@Validated注解在成員屬性上,則會(huì)報(bào)不適用于field的錯(cuò)誤。)
(4)
@Valid:沒有分組功能。
@Validated:提供分組功能,可以在參數(shù)驗(yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。
2.用法
(1)@Valid用法
a.導(dǎo)入依賴
SpringBoot項(xiàng)目:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.4.1.Final</version> </dependency>
b.使用前提是實(shí)體類中屬性使用注解進(jìn)行校驗(yàn)
package com.example.demo.pojo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; //lombok @Data public class User implements Serializable { //用戶名 @NotBlank(message = "請輸入名稱") @Length(message = "名稱不能超過個(gè) {max} 字符", max = 10) private String username; //年齡 @NotNull(message = "請輸入年齡") @Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100) private String age; }
c.在Controller方法參數(shù)中加上@Valid注解
package com.example.demo.controller; import com.example.demo.pojo.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.List; @RestController public class UserController { public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName()); @PostMapping("/add") @ResponseBody public String add(@Validated User user, BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> allErrors = bindingResult.getAllErrors(); allErrors.forEach( v ->{ logger.error(v.getObjectName()+"======"+v.getDefaultMessage()); }); return "添加失敗"; } return "添加成功"; } }
經(jīng)過測試填寫錯(cuò)誤數(shù)據(jù),會(huì)在控制臺(tái)輸出報(bào)錯(cuò)信息。
(2)@Validated用法
a.開啟校驗(yàn)框架(與上面一樣)
<!--1.導(dǎo)入JSR303規(guī)范--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <!--使用hibernate框架提供的校驗(yàn)器做實(shí)現(xiàn)--> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
c.在需要開啟校驗(yàn)功能的類上使用注解@Validated開啟校驗(yàn)功能,對具體的字段設(shè)置校驗(yàn)規(guī)則,這里講的是可以在類上使用@Validated注解,配合xml數(shù)據(jù)綁定。
@Component @Data @ConfigurationProperties(prefix = "servers") //開啟對當(dāng)前bean的屬性注入校驗(yàn) @Validated public class ServerConfig { //設(shè)置具體的規(guī)則 @Max(value = 8888,message = "最大值不能超過8888") @Min(value = 202,message = "最小值不能低于202") private int port; }
(3)@Validated實(shí)現(xiàn)分組校驗(yàn)
注意 分組校驗(yàn)就是把條件加入組中,可以自由選擇開啟那些組的校驗(yàn)方式。
a.分組接口
package com.example.demo.pojo; public interface Group { interface Update{}; interface FindAll{}; }
b.實(shí)體類
package com.example.demo.pojo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; //lombok @Data public class User implements Serializable { //用戶名 @NotBlank(message = "請輸入用戶名不能為空",groups = {Group.FindAll.class}) @Length(message = "名稱不能超過個(gè) {max} 字符", max = 10 ,groups = {Group.FindAll.class}) private String username; //年齡 @NotBlank(message = "請輸入年齡不能為空",groups = {Group.Update.class}) @Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100,groups = {Group.Update.class}) private String age; }
c.controller接口:
注意 @Validated有參數(shù) value中寫分組名稱
package com.example.demo.controller; import com.example.demo.pojo.Group; import com.example.demo.pojo.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.List; @RestController public class UserController { public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName()); @PostMapping("/add") @ResponseBody //注意@Validated有參數(shù) value中寫分組名稱 public String add(@Validated(value = {Group.Update.class}) User user, BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> allErrors = bindingResult.getAllErrors(); allErrors.forEach( v ->{ logger.error(v.getObjectName()+"======"+v.getDefaultMessage()); }); return "添加失敗"; } return "添加成功"; } }
(4)@Valid 實(shí)現(xiàn)嵌套校驗(yàn)
注: 嵌套檢測就是在一個(gè)User類中,存在另外一個(gè)User2類的屬性。嵌套檢測User同時(shí)也檢測User2。
a.實(shí)體類User
package com.example.demo.pojo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; //lombok @Data public class User implements Serializable { //用戶名 @NotBlank(message = "請輸入用戶名不能為空1") private String username; //年齡 @NotBlank(message = "請輸入年齡不能為空1") private String age; @Valid @NotNull(message = "user2不能為空1") private User2 user2; } }
b.實(shí)體類User2
package com.example.demo.pojo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import javax.validation.Valid; import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.Date; package com.example.demo.pojo; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.NotNull; import java.io.Serializable; //lombok @Data public class User2 implements Serializable { //用戶名 @Length(message = "名稱不能超過個(gè) {max} 字符2", max = 10 ) private String username2; //年齡 @Range(message = "年齡范圍為 {min} 到 {max} 之間2", min = 1, max = 100) private String age2; }
c.Controller類(這里使用@Valid)
package com.example.demo.controller; import com.example.demo.pojo.Group; import com.example.demo.pojo.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; import java.util.List; @RestController public class UserController { public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName()); @PostMapping("/add") @ResponseBody public String add(@Valid User user, BindingResult bindingResult){ if(bindingResult.hasErrors()){ List<ObjectError> allErrors = bindingResult.getAllErrors(); allErrors.forEach( v ->{ logger.error(v.getObjectName()+"======"+v.getDefaultMessage()); }); return "添加失敗"; } return "添加成功"; } }
總結(jié):
了解這兩個(gè)注解可以讓你的校驗(yàn)數(shù)據(jù)更加方便。
到此這篇關(guān)于SpringBoot學(xué)習(xí)篇之@Valid與@Validated區(qū)別的文章就介紹到這了,更多相關(guān)SpringBoot @Valid與@Validated區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot使用@Validated或@Valid注解校驗(yàn)參數(shù)方式
- springboot?@Validated的概念及示例實(shí)戰(zhàn)
- Springboot結(jié)合@validated優(yōu)化代碼驗(yàn)證
- SpringBoot參數(shù)校驗(yàn)之@Validated的使用詳解
- SpringBoot @Validated注解實(shí)現(xiàn)參數(shù)分組校驗(yàn)的方法實(shí)例
- Springboot @Validated和@Valid的區(qū)別及使用詳解
- springboot @validated List校驗(yàn)失效問題
相關(guān)文章
利用Spring插件實(shí)現(xiàn)策略模式的案例詳解
Spring插件提供了一種更實(shí)用的插件開發(fā)方法,它提供了插件實(shí)現(xiàn)擴(kuò)展核心系統(tǒng)功能的核心靈活性,但當(dāng)然不提供核心OSGi功能,如動(dòng)態(tài)類加載或運(yùn)行時(shí)安裝和部署插件,本文就來聊下如何使用spring插件來實(shí)現(xiàn)策略模式,需要的朋友可以參考下2023-05-05詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)
這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解
這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03詳解Java編程的Observer觀察者設(shè)計(jì)模式
這篇文章主要介紹了Java編程的Observer觀察者設(shè)計(jì)模式,觀察者模式定義了一個(gè)一對多的依賴關(guān)系,讓一個(gè)或多個(gè)觀察者對象監(jiān)察一個(gè)主題對象,需要的朋友可以參考下2016-01-01Java實(shí)現(xiàn)的決策樹算法完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的決策樹算法,簡單描述了決策樹的概念、原理,并結(jié)合完整實(shí)例形式分析了java實(shí)現(xiàn)決策樹算法的相關(guān)操作技巧,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下2017-11-11聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序
這篇文章主要介紹了聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法
這篇文章主要介紹了SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07