使用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 ...
随机推荐
- css伪元素:before和:after用法详解
css的伪元素,之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面 ...
- TwoSum / Three Sum
Let's begin with a naive method. We first need to sort the array A[n]. And we want to solve the prob ...
- 多用户在线人数监听(基于TomCat)
服务器Servlet端 package com.sxt.mvcpro.servlet; import java.io.IOException; import java.util.HashSet; im ...
- C#6.0语言规范(十) 类
类是可以包含数据成员(常量和字段),函数成员(方法,属性,事件,索引器,运算符,实例构造函数,析构函数和静态构造函数)和嵌套类型的数据结构.类类型支持继承,这是一种派生类可以扩展和专门化基类的机制. ...
- typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库
接上一篇,这里使用 sequelize 来连接 postgresql 数据库 1.安装 sequelize,数据库驱动 pg yarn add sequelize sequelize-typescri ...
- 7-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(TCP实现HTTP访问下载文件,明白底层如何实现的,地基稳才踏实)
看了好多文章.....唉,还是自己亲自动手用网络监控软件测试吧 先看这个节安装WEB服务器.....安装好以后就可以用HTTP访问电脑文件了 6-STM32物联网开发WIFI(ESP8266)+GPR ...
- Selenium自动化测试Python四:WebDriver封装
WebDriver 封装 欢迎阅读WebDriver封装讲义.本篇讲义将会重点介绍Selenium WebDriver API的封装的概念和方法,以及使用封装进行自动化测试的设计. WebDriver ...
- 源码分析篇 - Android绘制流程(一)窗口启动流程分析
Activity.View.Window之间的关系可以用以下的简要UML关系图表示,在这里贴出来,比较能够帮组后面流程分析部分的阅读. 一.Activity的启动流程 在startActivity() ...
- Android之密码的显示与隐藏
很多应用都是显示与隐藏密码的功能. 之前的项目都没这个功能要求,也没有专门研究这个.最近项目有加这个功能,我这里也刚好整理一下. 我的思路是设置EditText的InputType.代码如下: if ...
- Java类加载顺序
很长时间没看这方面的内容了,写篇文章让自己牢记一下,顺便分享一下. 首先,写代码以便检验结果.测试代码: public class Test { public static void main(Str ...