SpringBoot學(xué)習(xí)篇之@Valid與@Validated的區(qū)別
1.介紹
說明: 其實@Valid 與 @Validated都是做數(shù)據(jù)校驗的,只不過注解位置與用法有點不同。
不同點:
(1)
@Valid是使用Hibernate validation的時候使用。@Validated是只用Spring Validator校驗機制使用。
(2)
@Valid 可以嵌套驗證
@Validation 不能進行嵌套驗證
(3)
@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(field)上。
@Validated:用在類、方法和方法參數(shù)上。但不能用于成員屬性(field)。
(如果@Validated注解在成員屬性上,則會報不適用于field的錯誤。)
(4)
@Valid:沒有分組功能。
@Validated:提供分組功能,可以在參數(shù)驗證時,根據(jù)不同的分組采用不同的驗證機制。
2.用法
(1)@Valid用法
a.導(dǎo)入依賴
SpringBoot項目:
<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.使用前提是實體類中屬性使用注解進行校驗
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 = "名稱不能超過個 {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)過測試填寫錯誤數(shù)據(jù),會在控制臺輸出報錯信息。
(2)@Validated用法
a.開啟校驗框架(與上面一樣)
<!--1.導(dǎo)入JSR303規(guī)范--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <!--使用hibernate框架提供的校驗器做實現(xiàn)--> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
c.在需要開啟校驗功能的類上使用注解@Validated開啟校驗功能,對具體的字段設(shè)置校驗規(guī)則,這里講的是可以在類上使用@Validated注解,配合xml數(shù)據(jù)綁定。
@Component @Data @ConfigurationProperties(prefix = "servers") //開啟對當前bean的屬性注入校驗 @Validated public class ServerConfig { //設(shè)置具體的規(guī)則 @Max(value = 8888,message = "最大值不能超過8888") @Min(value = 202,message = "最小值不能低于202") private int port; }
(3)@Validated實現(xiàn)分組校驗
注意 分組校驗就是把條件加入組中,可以自由選擇開啟那些組的校驗方式。
a.分組接口
package com.example.demo.pojo; public interface Group { interface Update{}; interface FindAll{}; }
b.實體類
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 = "名稱不能超過個 {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 實現(xiàn)嵌套校驗
注: 嵌套檢測就是在一個User類中,存在另外一個User2類的屬性。嵌套檢測User同時也檢測User2。
a.實體類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.實體類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 = "名稱不能超過個 {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é):
了解這兩個注解可以讓你的校驗數(shù)據(jù)更加方便。
到此這篇關(guān)于SpringBoot學(xué)習(xí)篇之@Valid與@Validated區(qū)別的文章就介紹到這了,更多相關(guān)SpringBoot @Valid與@Validated區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標
這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解
這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序
這篇文章主要介紹了聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法
這篇文章主要介紹了SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07