使用Hibernate Validator来帮你做数据校验
数据校验是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每个层中实现相同的验证逻辑,这是耗时且容易出错的。这里我们可以使用Hibernate Validator来帮助我处理这项任务。对此,Hibernate Validator提供了一些注解来作为数据约束,我们只需要将这些注解添加到我们需要校验的属性/参数上面,就可以轻松的完成这项任务。
常见注解介绍
常见的注解,这里只是列出了一些常见的属性上面的约束以及他们所拥有的一些属性,更加详细的介绍请看 官方文档。
| 注解 | 数据类型 | 属性 | 注解说明 | |
| @NotNull | 字符串 | 添加注解的属性不能是null | ||
| @NotBlank | 字符串 | 检查字符串是否是null,且去掉空格后长度是否是0 | ||
| @AssertTrue | 布尔 | 检查值是否是true | ||
| @AssertFalse | 布尔 | 检查值是否是false | ||
| @DecimalMax | 数字 | 检查值是否大于设定值 | ||
| value | 设置的最大值 | |||
| inclusive | 是否等于 | |||
| @DecimalMin | 数字 | 检查值是否小于设定值 | ||
| value | 设置的最大值 | |||
| inclusive | 是否等于 | |||
| @Digits | 数字 | 校验数字小数点前后位数 | ||
integer |
小数点前几位 | |||
fraction |
小数点后几位 | |||
| 字符串 | 校验是不是邮箱 | |||
| @Future | 时间 | 检查日期是不是在将来 | ||
| @Past | 时间 | 检查日期是否在过去 | ||
| @Max | 数字类型 | 是否大于最大值 | ||
| @Min | 数字类型 | 是否小于最小值 | ||
| @Pattern | 字符串 | 使用正则校验 | ||
| @Size | 字符串,集合,数组 | 检查长度 |
简单的使用
看到上面的那么多注解是不是觉得很实用呢?有没有想试一试看看好不好用呢?接下来我们开始写一些代码来用一用,首先我们需要添加它的依赖。
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.15.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b09</version>
</dependency>
接下来定义一个Class,然后在他的属性上添加Hibernate Validator提供的一些注解
import lombok.Getter;
import lombok.Setter;
import lombok.ToString; import javax.validation.constraints.*;
import java.util.Date; /**
* 产品表
*
* @author hejiaxuan
*/
@Getter
@Setter
@ToString
public class Demo { @NotNull
@Digits(integer = 0, fraction = 3)
private Double aDouble; @Past(message = "time必须在今天之后")
private Date time; @Max(value = 5, message = "status不能大于5")
@Min(value = 0, message = "status不能小于0")
@NotNull(message = "status不能为null")
private Integer status; @Size(min = 2, max = 5, message = "name长度必须在2~5之间")
@NotBlank(message = "name不能为null")
private String name; }
对象定义好了,下面看看怎么用吧。
校验值:validator.validateValue
上面的代码中,我们定义的了一个对象,并且在它的每个属性上面添加了我们需要的校验规则(注解)。现在说一个不需要实例化对象就可以测试这些规则的方法, 代码如下:
//单独校验Class中的某个属性和值
Set<ConstraintViolation<Demo>> result = validator.validateValue(Demo.class, "name", "hahahaha");
Iterator<ConstraintViolation<Demo>> iterator = result.iterator();
while (iterator.hasNext()) {
ConstraintViolation<Demo> next = iterator.next();
//打印校验结果
System.out.println(next.getMessage());
}
//运行结果
name长度必须在2~5之间
校验整个对象:validator.validate
这里是校验这个对象的所有属性
//待校验对象
Demo demo = new Demo();
demo.setName("00000000");
demo.setADouble(200.001);
demo.setStatus(200);
//得到Validator实例
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
//开始校验
Set<ConstraintViolation<Demo>> result = validator.validate(demo);
Iterator<ConstraintViolation<Demo>> iterator = result.iterator();
while (iterator.hasNext()) {
ConstraintViolation<Demo> next = iterator.next();
//打印校验结果
System.out.println(next.getMessage());
} //运行结果
name不能为null
不能为null
status不能为null
因为对象没有设置任何值,所以校验结果都是 “某某某字段不能为null”,现在我们给demo对象设置几个值试一下
demo.setName("00000000");
demo.setADouble(200.001);
demo.setStatus(200);
//运行结果
数字的值超出了允许范围(只允许在0位整数和3位小数范围内)
status不能大于5
name长度必须在2~5之间
这里是校验整个对象的所有属性,但是如果我们只想校验一个对象里的部分属性怎么办呢?
校验单个属性 validator.validateProperty
这里是单独校验某一个对象其中的某几个属性,代码如下
//第一个参数是要校验的对象,后面的参数是要校验的对象属性名称
Set<ConstraintViolation<Demo>> result = validator.validateProperty(
demo,
"status"
);
//输出结果
status不能大于5
对于方法的校验
上面讲的都是对象属性的校验,那么怎样对一个方法的入参和出参进行校验呢?这里分为 方法参数的校验 和 返回值的校验。下面我们先给Demo.java添加一个方法,并添加约束注解:
public class Demo {
/**
* 要校验的方法
*
* @param string
* @return
*/
public @Size(min = 3, max = 10, message = "结果长度在3~10之间")
String getString(@NotBlank String string) {
return string;
}
}
校验方法的返回值:executableValidator.validateReturnValue
//对于方法的校验
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
ExecutableValidator executableValidator = factory.getValidator().forExecutables();
//实例化对象
Demo object = new Demo();
//获取对应的方法
Method method = Demo.class.getMethod("getString", String.class);
//获取它的返回值
Object returnValue = method.invoke(object, "这是方法的参数,要大于是个字");
Set<ConstraintViolation<Demo>> violations = executableValidator.validateReturnValue(
object,
method,
returnValue
);
//结果
Iterator<ConstraintViolation<Demo>> iterator = violations.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getMessage());
} //执行结果
结果长度在3~10之间
校验方法的入参:executableValidator.validateParameters
//对于方法的校验
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
ExecutableValidator executableValidator = factory.getValidator().forExecutables();
//实例化对象
Demo object = new Demo();
//获取对应的方法
Method method = Demo.class.getMethod("getString", String.class);
//方法的入参
Object[] parameters = {null};
Set<ConstraintViolation<Demo>> violations = executableValidator.validateParameters(
object,
method,
parameters
);
//结果
Iterator<ConstraintViolation<Demo>> iterator = violations.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().getMessage());
} //执行结果 不能为空
使用Hibernate Validator来帮你做数据校验的更多相关文章
- .net 使用validator做数据校验
概述 在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.net自带的数据校验框架validator.本文对validator的使用方法进行介绍,并分析下校验的的原理. 使用va ...
- StringMVC 中如何做数据校验
步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"> ...
- springboot使用validation 插件做数据校验
不多说废话. 首先,我们需要在入参实体对象中,使用注解,控制 @Datapublic class UpdateShufflingRequest { private String shuffling_l ...
- SpringBoot 2 快速整合 | Hibernate Validator 数据校验
概述 在开发RESTFull API 和普通的表单提交都需要对用户提交的数据进行校验,例如:用户姓名不能为空,年龄必须大于0 等等.这里我们主要说的是后台的校验,在 SpringBoot 中我们可以通 ...
- spring boot 1.4默认使用 hibernate validator
spring boot 1.4默认使用 hibernate validator 5.2.4 Final实现校验功能.hibernate validator 5.2.4 Final是JSR 349 Be ...
- 解决Hibernate validator抛出Ljavax/validation/ParameterNameProvider异常方法
最近升级CAS Client4.0客户端Spring版本至Spring4.*以上,升级整合hibernate框架时,Hibernate validator 4.3.0.Final使用版本(从Hiber ...
- SpringBoot入门 (十一) 数据校验
本文记录学习在SpringBoot中做数据校验. 一 什么是数据校验 数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数 ...
- @Valid 数据校验 + 自定义全局异常信息
关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...
- (32)forms组件(数据校验)
forms组件的用处 1.就是用来做数据校验的 2.渲染页面 3.渲染错误信息(和局部刷新同效果) 数据校验 要使用forms组件必须要写一个类继承forms组件 urls.py from bbs01 ...
随机推荐
- 发送短信功能(C#)
参考自:https://blog.csdn.net/whl632359961/article/details/73468115 https://www.cnblogs.com/ywl925/archi ...
- Spring Cloud实践之集中配置Spring-config
将一个系统中各个应用的配置文件集中起来,方便管理. import org.springframework.boot.SpringApplication; import org.springframew ...
- DS-博客作业03--栈和队列
1.本周学习总结 第三章主要介绍栈和队列的基本概念,存储结构,基本运算算法设计和应用实例.从组成元素的逻辑关系来看,栈和队列都属于线性结构.栈和队列与线性表的不同之处就在于他们的相关运算具有一些特殊性 ...
- CF1082解题报告
CF1082A Vasya and Book 模拟一下即可 \(Code\ Below:\) #include <bits/stdc++.h> using namespace std; c ...
- spring cloud学习(六) 配置中心-自动更新
上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...
- 大脸猫讲逆向之ARM汇编中PC寄存器详解
i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...
- isBalanced函数实现
原文:从一道面试题谈起,作者:360奇舞团 刘观宇 题目: 创建一个函数来判断给定的表达式中的大括号是否闭合,返回 true/false,对于空字符串,返回 true var expression = ...
- Java swing皮肤(look and feel)大全
########## 优选 ########## Weblaf:非常赞的套件,界面现代.简约.依赖包较少. 有开源也有商业协议,个人最喜欢的皮肤.https://github.com/mgarin/w ...
- vue路由router的三种传参方式
方法三: 传参页面传递参数方式: this.$router.push({ path: 'indexTwoDetails', query: { "id": id } }) 接受参数页 ...
- 不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)
数据库用户信息死活无法修改..老是出现错误当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关). (Micr ...