SpringBoot学习篇之@Valid与@Validated的区别
作者:陈老老老板 发布时间:2021-08-07 21:38:41
1.介绍
说明: 其实@Valid 与 @Validated都是做数据校验的,只不过注解位置与用法有点不同。
不同点:
(1)
@Valid是使用Hibernate validation的时候使用。@Validated是只用Spring Validator校验机制使用。
(2)
@Valid 可以嵌套验证
@Validation 不能进行嵌套验证
(3)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上。
@Validated:用在类、方法和方法参数上。但不能用于成员属性(field)。
(如果@Validated注解在成员属性上,则会报不适用于field的错误。)
(4)
@Valid:没有分组功能。
@Validated:提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制。
2.用法
(1)@Valid用法
a.导入依赖
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方法参数中加上@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 "添加成功";
}
}
经过测试填写错误数据,会在控制台输出报错信息。
(2)@Validated用法
a.开启校验框架(与上面一样)
<!--1.导入JSR303规范-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校验器做实现-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
c.在需要开启校验功能的类上使用注解@Validated开启校验功能,对具体的字段设置校验规则,这里讲的是可以在类上使用@Validated注解,配合xml数据绑定。
@Component
@Data
@ConfigurationProperties(prefix = "servers")
//开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
//设置具体的规则
@Max(value = 8888,message = "最大值不能超过8888")
@Min(value = 202,message = "最小值不能低于202")
private int port;
}
(3)@Validated实现分组校验
注意 分组校验就是把条件加入组中,可以自由选择开启那些组的校验方式。
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有参数 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有参数 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 实现嵌套校验
注: 嵌套检测就是在一个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 "添加成功";
}
}
总结:
了解这两个注解可以让你的校验数据更加方便。
来源:https://blog.csdn.net/weixin_47343544/article/details/127146089
猜你喜欢
- java的jar是一个打包工具,用于将我们编译后的class文件打包起来,这里面主要是举一个例子用来说明这个工具的使用。在C盘下的temp文
- 这篇文章主要介绍了java内存泄漏与内存溢出关系解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 由于众所周知的原因,maven的库在中国大陆非常慢。我在百度上搜到的大部分文章都是直接在~/.m2/settings.xml 加入以下内容&
- 注解注解定义Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变
- 目录MeasureSpecLayoutParamViewViewGroupTextColumn使用总结
- 使用 replace 函数动态填充字符串String str="Hello {0},我是 {1},今年{2}岁"
- MyBatis-Spring允许你在Service Bean中注入映射器。当使用映射器时,就像调用DAO那样来调用映射器就可以了,但是此时你
- 引言♀ 小AD:明哥,昨天气死我了,明哥要帮我出气。♂ 明世隐:咋了,有谁惹到你了。♀ 小AD:昨天辅助喷我小鲁班菜,我反手就对喷,然后竟然
- 在windows环境下进行的测试,前提条件,windows上需要先安装openssl。配置环境变量,查看版本:import java.io.
- 前言在消息发送过程中,生产者从NameServer中获取到了指定Topic对应的Broker信息,在同步发送消息的代码中,如果消息发送失败,
- 理论基础so的加载是一种解析式装载,这与dex有一定区别,dex是先加载进行优化验证生成odex,再去解析odex文件,而so更像边解析边装
- import java.io.File; public class ShowAllXML { public static void main
- 实例如下:using System;using System.Linq.Expressions;class DynamicPredicate
- 内存泄露,是Android开发者最头疼的事。可能一处小小的内存泄露,都可能是毁千里之堤的蚁穴。 怎么才能检测内存泄露呢? AndroidSt
- 写在前面Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程。用户启动Activi
- demo下载重要代码://1、此layout作为最外层的layout;//2、设置需要调整的view: setAdjustView(View
- Java持久化框架:Hibernate与MybatisHibernate和Mybatis是两个Java持久化框架,用于将Java对象映射到关
- 前言JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发平台。最早由Sun公司定制并发
- 前言在C语言中,没有专门用来表示字符串的类型。C语言的字符串是一系列以’\0’为结尾的字符的集合。虽
- Java HashSetHashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。HashSet 允许有 null 值。