使用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#之WinForm设置控件居中
简单阐述 在C#的WinForm里面,原生控件是没有居中属性的,故通过重写OnResize(EventArgs e)方法,通过计算,重新定位控件位置. 以Label控件为例 (1)将label的Aut ...
- WPF异常捕获三种处理 UI线程, 全局异常,Task异常
protected override void OnStartup(StartupEventArgs e){base.OnStartup(e);RegisterEvents();} private v ...
- [C++基础]队列<queue>中的常用函数
在C++中只要#include<queue>即可使用队列类,其中在面试或笔试中常用的成员函数如下(按照最常用到不常用的顺序) 1. push 2. pop 3. size 4. empty ...
- webpack快速入门——实战技巧:watch的正确使用方法,webpack自动打包
随着项目大了,后端与前端联调,我们不需要每一次都去打包,这样特别麻烦,我们希望的场景是,每次按保存键,webpack自动为我们打包,这个工具就是watch! 因为watch是webpack自带的插件, ...
- 上下文相关的GMM-HMM声学模型续:参数共享
一.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 二.参 ...
- iOS---代理、协议、通知 详解
一.代理 1.代理的介绍 代理是一种通用的设计模式 代理使用方式:A 让 B 做件事,空口无凭,签个协议. 所以代理有三部分组成: 委托方: 定义协议 协议 : 用来规定代理方可以做什么,必须做什 ...
- Liferay-Activiti 企业特性功能介绍 (新版Liferay7)
前言 如果你是开发者 你已经是多少次开发一个项目,一次次的用一些框架,一次次的写类似的重复的代码,一次次建表\写类和方法\写HTML\CSS\JAVASCRIPT,一次次测试,一次次的写Bug...如 ...
- postgresql-pgbench(转)
pgbench测试: pg9.6.2的pgbench报错: [thunisoft@localhost ~]$ pgbench -S -c 8 -t 60 pgbenchdb Segmentatio ...
- C#:使用ListView动态添加数据一直闪烁的解决办法
首先,自定义一个类ListViewNF,继承自 System.Windows.Forms.ListView using System; using System.Collections.Generic ...
- 整理学习ASP.NET MVC的资源
网站 http://www.asp.net/mvc http://stackoverflow.com/questions/tagged/asp.net-mvc+asp.net-mvc-4?sort=n ...