Hibernate Validator参数校验
日常开发中经常会遇到需要参数校验的情况,比如某个字段不能为空、长度不能超过5等都属于参数校验的范围。对于简单的参数校验通过写几个if-else判断语句就搞定,但是对于复杂的多个参数校验的情况,就不是那么简单了,通常是各种循环嵌套+一堆if-else语句。一个字,丑!
所以,这就需要引进本文的主人公——Hibernate Validator(下文简称hb)。顾名思义,这是出自ORM框架Hibernate之手,那么,这个玩意可以帮助我们什么呢?
Express validation rules in a standardized way using annotation-based constraints and benefit from transparent integration with a wide variety of frameworks.
使用基于注解的约束,以标准化的方式表达验证规则,并可以与大多数框架无缝集成。
既然是基于注解进行阐述校验,那么有哪些注解呢?
参数注解
hv的参数校验有多个级别:
- bean
- method
bean也就是JavaBean(一个标准的)校验又有三种:
field constraints(字段)
property constraints(属性)
class constraints(类)
参数注解可以附加到字段、getter方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的约束。
hv提供了JSR规范中所有内置constraint的实现,除此之外还有一些附加的constraint。


快速入门
引入pom依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.4.Final</version>
</dependency>
JavaBean:
public class CarBO {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 5)
private String licensePlate;
@Min(5)
private int seatCount;
public CarBO(String manufacturer, String licencePlate, int seatCount) {
this.manufacturer = manufacturer;
this.licensePlate = licencePlate;
this.seatCount = seatCount;
}
//setter、getter
}
编写测试类:
public class CarTest {
private static Validator validator;
@BeforeClass
public static void setUp() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@Test
public void manufacturerIsNull() {
CarBO car = new CarBO( null, "DD-AB-123", 4 );
Set<ConstraintViolation<CarBO>> constraintViolations =
validator.validate( car );
assertEquals( 1, constraintViolations.size() );
assertEquals(
"may not be null",
constraintViolations.iterator().next().getMessage()
);
}
@Test
public void licensePlateTooShort() {
CarBO car = new CarBO( "Morris", "D", 4 );
Set<ConstraintViolation<CarBO>> constraintViolations =
validator.validate( car );
assertEquals( 1, constraintViolations.size() );
assertEquals(
"size must be between 2 and 14",
constraintViolations.iterator().next().getMessage()
);
}
@Test
public void seatCountTooLow() {
CarBO car = new CarBO( "Morris", "DD-AB-123", 1 );
Set<ConstraintViolation<CarBO>> constraintViolations =
validator.validate( car );
assertEquals( 1, constraintViolations.size() );
assertEquals(
"must be greater than or equal to 2",
constraintViolations.iterator().next().getMessage()
);
}
@Test
public void carIsValid() {
CarBO car = new CarBO( "Morris", "DD-AB-123", 2 );
Set<ConstraintViolation<CarBO>> constraintViolations =
validator.validate( car );
assertEquals( 0, constraintViolations.size() );
}
}
在实际场景中,对于非法的参数需要抛出异常,比如哪个参数因为什么校验不通过。具体哪个字段可以通过ConstraintViolation的getPropertyPath方法获取,校验的提示信息可以通过ConstraintViolation的getMessage方法获取。
实例如下:
private void validate(CarBO car) {
Set<ConstraintViolation<CarBO>> constraintViolations = validator.validate( car );
if (!constraintViolations.isEmpty()) {
throw new RuntimeException("参数非法!!" + getValidateMsg(constraintViolations));
}
}
private String getValidateMsg(Set<ConstraintViolation<CarBO>> constraintViolations) {
StringBuilder msg = new StringBuilder();
for (ConstraintViolation<CarBO> violation : constraintViolations) {
msg.append(violation.getPropertyPath())
.append(violation.getMessage())
.append(",");
}
return msg.substring(0, msg.lastIndexOf(","));
}
Hibernate Validator参数校验的更多相关文章
- hibernate validator参数校验&自定义校验注解
参数校验:简单的就逐个手动写代码校验,推荐用Valid,使用hibernate-validator提供的,如果参数不能通过校验,报400错误,请求格式不正确: 步骤1:在参数对象的属性上添加校验注解如 ...
- validator参数校验
目录 validator参数校验 validator参数校验 type Req struct { Sn string `json:"sn" binding:"requir ...
- hibernate validator自定义校验注解以及基于服务(服务组)的校验
hibernate validator是Bean Validation 1.1 (JSR 349) Reference Implementation,其广泛的应用在mvc的参数校验中,尤其是使用服务端 ...
- Hibernate Validator数据校验框架常用注释
使用前先配置maven,加入依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId> ...
- SpringBoot 2 快速整合 | Hibernate Validator 数据校验
概述 在开发RESTFull API 和普通的表单提交都需要对用户提交的数据进行校验,例如:用户姓名不能为空,年龄必须大于0 等等.这里我们主要说的是后台的校验,在 SpringBoot 中我们可以通 ...
- SpringMVC--使用hibernate validator数据校验
JSR 303 Spring3开始支持JSR 303 验证框架,JSR303是Java为Bean数据合法性校验所提供的标准框架.JSR 303 支持XML和注解风格的验证,通过在Bean属性上标注类似 ...
- validator 参数校验的常用注解
@AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNull 任意类型 ...
- Java Bean Validation(参数校验) 最佳实践
转载来自:http://www.cnblogs.com 参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的 ...
- SpringBoot 参数校验的方法
Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...
随机推荐
- 前端初级技能No.1 [切图]
“切图”是指通过测量设计稿,从设计稿中提取图片等方式为页面开发提供支持的过程. 整个“切图”过程主要分为以下五个主要步骤: 分析设计图: 测量元素: 提取图片: 保存图片: 图片优化与合并: 1.分析 ...
- 最短路径 bellman-ford
初始化:将除源点外的所有顶点的最短距离估计值 d[v] ←+∞, d[s] ←0 迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离:(运行|v ...
- 大端和小端(big endian little endian)
一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...
- 管理账号密码的工具-KeePass使用方法
附件链接:https://files.cnblogs.com/files/stxs/KeePass.zip 打开压缩包“KeePass.zip",将文件"KeePass.exe&q ...
- windchill系统安装大概步骤
1.安装VMware Workstation虚拟机 2.win7的64位操作系统(为什么不用32位?因为32位的内存最大只能设置4G) 3.安装Oracle数据库(映射iso文件[上面栏的虚拟机-&g ...
- codeforce diversity
2017-08-25 14:59:34 writer:pprp 题意如下:给你一个串字符,再给你一个数字,表示在字符串中的各不相同的字符个数, 问你最少需要改变几个字符达到要求,不能达到要求就输出im ...
- 《Django By Example》
<Django By Example>第六章 中文 翻译 (个人学习,渣翻) 书籍出处:https://www.packtpub.com/web-development/django-ex ...
- 在php中define和const定义常量的区别
define和const都可以用来定义常量,但是const定义常量的时候大小写敏感,而define可以通过设置第三个参数为true的时候来取消大小写敏感! 如图: 引用地址:点这里
- Gogeos安装
环境要求: Windows64,Go,minGW(统一64位) 1.安装geos 下载GEOS 3.3.8源码,解压后,按readme文件编译(基于VS2010的64位编译工具执行的nmake编译命令 ...
- python+opencv链接摄像头
import cv2 import numpy as numpy cap=cv2.VideoCapture(0) #设置显示分辨率和FPS ,不设置的话会非常卡 cap.set(cv2.CAP_PRO ...