SpringBoot學(xué)習(xí)篇之@Valid與@Validated的區(qū)別
1.介紹
說(shuō)明: 其實(shí)@Valid 與 @Validated都是做數(shù)據(jù)校驗(yàn)的,只不過(guò)注解位置與用法有點(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:用在類(lèi)、方法和方法參數(shù)上。但不能用于成員屬性(field)。
(如果@Validated注解在成員屬性上,則會(huì)報(bào)不適用于field的錯(cuò)誤。)
(4)
@Valid:沒(méi)有分組功能。
@Validated:提供分組功能,可以在參數(shù)驗(yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。
2.用法
(1)@Valid用法
a.導(dǎo)入依賴(lài)
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í)體類(lèi)中屬性使用注解進(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 {
//用戶(hù)名
@NotBlank(message = "請(qǐng)輸入名稱(chēng)")
@Length(message = "名稱(chēng)不能超過(guò)個(gè) {max} 字符", max = 10)
private String username;
//年齡
@NotNull(message = "請(qǐng)輸入年齡")
@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)過(guò)測(cè)試填寫(xiě)錯(cuò)誤數(shù)據(jù),會(huì)在控制臺(tái)輸出報(bào)錯(cuò)信息。


(2)@Validated用法
a.開(kāi)啟校驗(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.在需要開(kāi)啟校驗(yàn)功能的類(lèi)上使用注解@Validated開(kāi)啟校驗(yàn)功能,對(duì)具體的字段設(shè)置校驗(yàn)規(guī)則,這里講的是可以在類(lèi)上使用@Validated注解,配合x(chóng)ml數(shù)據(jù)綁定。
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//開(kāi)啟對(duì)當(dāng)前bean的屬性注入校驗(yàn)
@Validated
public class ServerConfig {
//設(shè)置具體的規(guī)則
@Max(value = 8888,message = "最大值不能超過(guò)8888")
@Min(value = 202,message = "最小值不能低于202")
private int port;
}
(3)@Validated實(shí)現(xiàn)分組校驗(yàn)
注意 分組校驗(yàn)就是把條件加入組中,可以自由選擇開(kāi)啟那些組的校驗(yàn)方式。
a.分組接口
package com.example.demo.pojo;
public interface Group {
interface Update{};
interface FindAll{};
}b.實(shí)體類(lèi)
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 {
//用戶(hù)名
@NotBlank(message = "請(qǐng)輸入用戶(hù)名不能為空",groups = {Group.FindAll.class})
@Length(message = "名稱(chēng)不能超過(guò)個(gè) {max} 字符", max = 10 ,groups = {Group.FindAll.class})
private String username;
//年齡
@NotBlank(message = "請(qǐng)輸入年齡不能為空",groups = {Group.Update.class})
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100,groups = {Group.Update.class})
private String age;
}
c.controller接口:
注意 @Validated有參數(shù) value中寫(xiě)分組名稱(chēng)
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中寫(xiě)分組名稱(chēng)
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)
注: 嵌套檢測(cè)就是在一個(gè)User類(lèi)中,存在另外一個(gè)User2類(lèi)的屬性。嵌套檢測(cè)User同時(shí)也檢測(cè)User2。
a.實(shí)體類(lèi)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 {
//用戶(hù)名
@NotBlank(message = "請(qǐng)輸入用戶(hù)名不能為空1")
private String username;
//年齡
@NotBlank(message = "請(qǐng)輸入年齡不能為空1")
private String age;
@Valid
@NotNull(message = "user2不能為空1")
private User2 user2;
}
}b.實(shí)體類(lèi)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 {
//用戶(hù)名
@Length(message = "名稱(chēng)不能超過(guò)個(gè) {max} 字符2", max = 10 )
private String username2;
//年齡
@Range(message = "年齡范圍為 {min} 到 {max} 之間2", min = 1, max = 100)
private String age2;
}c.Controller類(lèi)(這里使用@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)容請(qǐng)搜索腳本之家以前的文章或繼續(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)失效問(wèn)題
相關(guān)文章
如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred 
這篇文章主要介紹了如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java程序順序結(jié)構(gòu)中邏輯控制語(yǔ)句詳解流程
在程序開(kāi)發(fā)的過(guò)程之中一共會(huì)存在有三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對(duì)于之前所編寫(xiě)的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行2021-10-10
java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Java并發(fā)線程之線程池的知識(shí)總結(jié)
這篇文章主要介紹了Java并發(fā)線程之線程池的知識(shí)總結(jié),幫助大家更好的理解和學(xué)習(xí)Java并發(fā)線程的相關(guān)內(nèi)容,感興趣的朋友可以了解下2021-01-01
基于spring boot實(shí)現(xiàn)一個(gè)全局異常處理器
在項(xiàng)目開(kāi)發(fā)中,我們可以基于spring boot提供的切面特性,來(lái)很輕松的實(shí)現(xiàn)全局異常的處理,所以本文主要為大家介紹了如何基于spring boot實(shí)現(xiàn)一個(gè)全局異常處理器,有需要的可以參考下2023-09-09
如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序
HTTP/HTTPS是最常見(jiàn)的協(xié)議套件之一,并且隨著智能手機(jī)的成功,它的應(yīng)用也日益廣泛,因?yàn)閷?duì)于任何公司來(lái)說(shuō),擁有一個(gè)可以被移動(dòng)設(shè)備訪問(wèn)的網(wǎng)站幾乎是必須的。下面就來(lái)看看如何開(kāi)發(fā)基于Netty的HTTP/HTTPS應(yīng)用程序2021-06-06
將SpringBoot項(xiàng)目無(wú)縫部署到Tomcat服務(wù)器的操作流程
SpringBoot 是一個(gè)用來(lái)簡(jiǎn)化 Spring 應(yīng)用初始搭建以及開(kāi)發(fā)過(guò)程的框架,我們可以通過(guò)內(nèi)置的 Tomcat 容器來(lái)輕松地運(yùn)行我們的應(yīng)用,本文給大家介紹 SpringBoot 項(xiàng)目部署到獨(dú)立 Tomcat 服務(wù)器的操作流程,需要的朋友可以參考下2024-05-05

