数据校验是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每个层中实现相同的验证逻辑,这是耗时且容易出错的。这里我们可以使用Hibernate Validator来帮助我处理这项任务。对此,Hibernate Validator提供了一些注解来作为数据约束,我们只需要将这些注解添加到我们需要校验的属性/参数上面,就可以轻松的完成这项任务。

常见注解介绍

常见的注解,这里只是列出了一些常见的属性上面的约束以及他们所拥有的一些属性,更加详细的介绍请看 官方文档。

注解 数据类型 属性 注解说明  
@NotNull 字符串   添加注解的属性不能是null  
@NotBlank 字符串   检查字符串是否是null,且去掉空格后长度是否是0  
@AssertTrue 布尔   检查值是否是true  
@AssertFalse 布尔   检查值是否是false  
@DecimalMax 数字   检查值是否大于设定值  
    value 设置的最大值  
    inclusive 是否等于  
@DecimalMin 数字   检查值是否小于设定值  
    value 设置的最大值  
    inclusive 是否等于  
@Digits 数字   校验数字小数点前后位数  
    integer 小数点前几位  
    fraction 小数点后几位  
@Email 字符串   校验是不是邮箱  
@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来帮你做数据校验的更多相关文章

  1. .net 使用validator做数据校验

    概述 在把用户输入的数据存储到数据库之前一般都要对数据做服务端校验,于是想到了.net自带的数据校验框架validator.本文对validator的使用方法进行介绍,并分析下校验的的原理. 使用va ...

  2. StringMVC 中如何做数据校验

    步骤一:引入四个jar包 步骤二:注册类型转换器 <context:component-scan base-package="cn.happy.controller"> ...

  3. springboot使用validation 插件做数据校验

    不多说废话. 首先,我们需要在入参实体对象中,使用注解,控制 @Datapublic class UpdateShufflingRequest { private String shuffling_l ...

  4. SpringBoot 2 快速整合 | Hibernate Validator 数据校验

    概述 在开发RESTFull API 和普通的表单提交都需要对用户提交的数据进行校验,例如:用户姓名不能为空,年龄必须大于0 等等.这里我们主要说的是后台的校验,在 SpringBoot 中我们可以通 ...

  5. 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 ...

  6. 解决Hibernate validator抛出Ljavax/validation/ParameterNameProvider异常方法

    最近升级CAS Client4.0客户端Spring版本至Spring4.*以上,升级整合hibernate框架时,Hibernate validator 4.3.0.Final使用版本(从Hiber ...

  7. SpringBoot入门 (十一) 数据校验

    本文记录学习在SpringBoot中做数据校验. 一 什么是数据校验 数据校验就是在应用程序中,对输入进来得数据做语义分析判断,阻挡不符合规则得数据,放行符合规则得数据,以确保被保存得数据符合我们得数 ...

  8. @Valid 数据校验 + 自定义全局异常信息

    关于javax.validation.Validator校验的使用 对于要校验的实体类:其需要校验的字段上需要添加注解 实际例子 使用:首先要拿到 validator的子类 Validator val ...

  9. (32)forms组件(数据校验)

    forms组件的用处 1.就是用来做数据校验的 2.渲染页面 3.渲染错误信息(和局部刷新同效果) 数据校验 要使用forms组件必须要写一个类继承forms组件 urls.py from bbs01 ...

随机推荐

  1. 简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析

    简单理解 OAuth 2.0 及资料收集,IdentityServer4 部分源码解析 虽然经常用 OAuth 2.0,但是原理却不曾了解,印象里觉得很简单,请求跳来跳去,今天看完相关介绍,就来捋一捋 ...

  2. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  3. “全栈2019”Java多线程第三十六章:如何设置线程的等待截止时间

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 下一章 "全栈2019"J ...

  4. JavaScript 知识

    1. js中this表示当前标签,获取当前标签内的属性,示例如下: var user_id = $(this).attr("data-user-id"); 2.   * js中va ...

  5. 读取型CSRF-需要交互的内容劫持

    本文作者:i春秋作家——jing0102 前言 最近在挖洞,"实践出真知"这句话说的很对,在实际挖掘过程中我会思考很多东西,跟朋友一起准备做一份手册,忽然的想到了一些漏洞的定义和规 ...

  6. Apache Roller 5.0.3 XXE漏洞分析

    下载5.0.2的版本来分析 5.0.2的war包地址 http://archive.apache.org/dist/roller/roller-5/v5.0.2/bin/roller-weblogge ...

  7. POJ 2871

    #include<iostream> #include<stdio.h> #include<iomanip> using namespace std; int ma ...

  8. webgl之观察三维空间

    在之前的教程中,我们已经接触到了3d的基本应用,而这里,将会继续介绍两种不同的相机,即透视相机和正投影相机:还会学习设置相机的不同参数,这样就可以使场景以不同的角度显示出来. 一.正投影和透视投影概念 ...

  9. C++:复制构造函数

    关于复制构造函数的具体细节:浅层复制和深层复制等可以看下 范磊老师的<零起点学通C++>视频教程和<C++ Primer Plus>一书. 相信看完后,对复制构造函数能基本掌握 ...

  10. Git for Windows之团队合作

    1.先给项目添加一个成员 输入对方码云邮箱账号,添加成功. 2.登陆,将码云上面的项目克隆到本地 (1).设置全局参数  用户名和邮箱用于push和pull代码 (2).克隆目标项目地址 查看本地文件 ...