hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)
一:背景说明
验证数据是一个常见的任务,它贯穿于所有应用层,从呈现到持久层。通常在每个层中都执行相同的验证逻辑,耗时且容易出错。为了避免这些验证的重复,开发商往往把验证逻辑直接进入的领域模型,在领域类的验证码,这真是对类本身的元数据。
只需要一个domain进行添加注解,然后在想要使用数据的层使用验证即可。
二:Bean的注解说明
1.说明
在Bean验证约束是通过java注释表示。在本节中,您将学习如何使用这些注释增强对象模型。有四种类型的bean约束:
field constraints:在使用字段级约束时,字段访问策略用于访问要验证的值。这意味着验证引擎直接访问实例变量和不调用属性访问器方法,即使这样一个访问器的存在。
- 注意点虽然支持private或者public,是不支持static的字段
property constraints:如果你的模型类遵循JavaBeans规范,也可以放在领域类的属性上标注,就是get方法上
- 注意点,不包括set方法
container element constraints:容器元素的约束
class constraints:类约束
附件一:bean约束
适用于field/property的约束
@AssertFalse
被注释的元素必须为 false
@AssertTrue
被注释的元素必须为 true
@DecimalMax(value=, inclusive=)
当包含inclusive
= false时,检查带注释的值是否小于指定的最大值。否则值是否小于或等于指定的最大值。
参数值是根据BigDecimal的字符串表示的最大值的字符串表示形式。
@DecimalMin(value=, inclusive=)
当包含inclusive
= false时,检查带注释的值是否大于指定的最小值。
否则值是否大于或等于指定的最小值。
参数值是根据BigDecimal字符串表示的值的字符串表示形式。
@Digits(integer=, fraction=)
检查带注释的值是否是具有整数位数和小数位数的数字
@Email
被注释的元素必须是电子邮箱地址
@Future
被注释的元素必须是一个将来的日期
@FutureOrPresent
被注释的元素必须是一个将来的日期或者现在
@Max(value=)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Min(value=)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@NotBlank
被注释的字符串的必须非空,同时,长度大于0
@NotEmpty
被注释的字符串的必须非空,非null
@NotNull
被注释的字符串的必须非空
@Negative
检查元素是否严格负。零值被认为是无效的。
@NegativeOrZero
注释的检查元素是负或者零值。
@Null
注释的元素必须是null
@Past
注释的元素时间必须是过去的时间
@PastOrPresent
注释的元素时间必须是过去或者当前
@Pattern(regex=, flags=)
被注释的元素必须符合指定的正则表达式
@Positive
被注释的元素必须是严格的正值,不包括零值
@PositiveOrZero
被注释的元素是正值或者零
@Size(min=, max=)
被注释的元素的大小必须在指定的范围内,包含最大值
附件二:附加的约束
除了由Bean验证API定义的约束,Hibernate Validator提供一些有用的自定义约束条件如下。适用于field/property的约束,只有“scriptassert是class级约束。
@CreditCardNumber(ignoreNonDigitCharacters=)
这个验证旨在检查用户的错误,而不是信用卡的有效性
@Currency(value=)
验证货币单位
@EAN
检查注释字符序列是一个有效的EAN条码
@Length(min=, max=)
被注释的字符串的大小必须在指定的范围内
@Range(min=, max=)
被注释的元素必须在合适的范围内
@SafeHtml(whitelistType= , additionalTags=, additionalTagsWithAttributes=, baseURI=)
classpath中要有jsoup包
@URL(protocol=, host=, port=, regexp=, flags=)
被注释的字符串必须是一个有效的url
@ScriptAssert(lang=, script=, alias=, reportOn=)
要有Java Scripting API
三:案例一(field的验证)
1.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.caojun.it</groupId>
<artifactId>hibernateValidator</artifactId>
<version>1.0-SNAPSHOT</version> <!--hibernate validator-->
<dependencies>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.5.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.1-b08</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.5.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies> </project>
2.Car.java
package org.hibernate.validator.referenceguide.chapter01; import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; /**
* 对car的约束条件:
* manufacturer不为空
* licensePlate长度是2,14之间
* seatCount最小值是2
*/
public class Car {
@NotNull
private String manufacturer; @NotNull
@Size(min = 2, max = 14)
private String licensePlate; @Min(2)
private int seatCount; public Car(){} public Car(String manufacturer, String licencePlate, int seatCount) {
this.manufacturer = manufacturer;
this.licensePlate = licencePlate;
this.seatCount = seatCount;
} public String getManufacturer() {
return manufacturer;
} public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
} public String getLicensePlate() {
return licensePlate;
} public void setLicensePlate(String licensePlate) {
this.licensePlate = licensePlate;
} public int getSeatCount() {
return seatCount;
} public void setSeatCount(int seatCount) {
this.seatCount = seatCount;
}
}
3.测试案例
package org.hibernate.validator.referenceguide.chapter01; import org.junit.BeforeClass;
import org.junit.Test; import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Iterator;
import java.util.Set; import static org.junit.Assert.assertEquals; /**
* 对car的测试类
*/
public class CarTest {
private static Validator validator; /**
* 生成validator校验器
*/
@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
} /**
* 验证整个Car
*/
@Test
public void test() {
Car car = new Car( null, "DD-AB-123", 1);
//如果有不符合的在validate后,会将错误信息存放到Set中
Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car );
//如果ite中没有信息,就是正确的
Iterator<ConstraintViolation<Car>> ite = constraintViolations.iterator();
while(ite.hasNext()) {
System.out.println(ite.next().getMessage());
}
} /**
* 单独验证Car对象中的某一个属性,例如licensePlate
*/
@Test
public void licensePlateTooShort() {
Car car = new Car( "Morris", "D", 4 ); Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car ); //这里使用junit中的断言,断言会出现一个exception
assertEquals( 1, constraintViolations.size() ); } }
四:案例二(property的验证)
1.Car.java
package org.hibernate.validator.referenceguide.chapter02.propertylevel; import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotNull; public class Car {
private String manufacturer; private boolean isRegistered; public Car(String manufacturer, boolean isRegistered) {
this.manufacturer = manufacturer;
this.isRegistered = isRegistered;
} @NotNull
public String getManufacturer() {
return manufacturer;
} public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
} @AssertTrue
public boolean getIsRegistered() {
return isRegistered;
} public void setRegistered(boolean isRegistered) {
this.isRegistered = isRegistered;
}
public Car(){} }
2.CarTest.java
package org.hibernate.validator.referenceguide.chapter02.propertylevel;
import static org.junit.Assert.assertEquals; import org.junit.BeforeClass;
import org.junit.Test; import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Iterator;
import java.util.Set; public class CarTest {
private static Validator validator; /**
* 生成validator校验器
*/
@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
/**
* 验证整个Car
*/
@Test
public void test() {
Car car=new Car("asaas",true);
//如果有不符合的在validate后,会将错误信息存放到Set中
Set<ConstraintViolation<Car>> constraintViolations = validator.validate( car );
//如果ite中没有信息,就是正确的
Iterator<ConstraintViolation<Car>> ite = constraintViolations.iterator();
while(ite.hasNext()) {
System.out.println(ite.next().getMessage());
}
}
}
hibernate Validator 6.X 的学习,bean的约束(字段,get方法上的验证)的更多相关文章
- hibernate Validator 6.X 的学习,bean的约束(主要包括的是容器元素的验证)
1. 四:案例二(property的验证) 1.
- SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问
系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @Requ ...
- Hibernate Validator 6.0.9.Final - JSR 380 Reference Implementation: Reference Guide
Preface Validating data is a common task that occurs throughout all application layers, from the pre ...
- spring 项目中使用 hibernate validator验证输入参数
1 hibernate validator 官方文档:https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_si ...
- hibernate validator【原】
hibernate validator 功能 在开发中经常做一些字段校验的功能,比如非空,长度限制,邮箱验证等等,为了省掉这种冗长繁琐的操作,hibernate validator提供了一套精简的注释 ...
- Spring源码学习之:@async 方法上添加该注解实现异步调用的原理
在我们使用spring框架的过程中,在很多时候我们会使用@async注解来异步执行某一些方法,提高系统的执行效率.今天我们来探讨下 spring 是如何完成这个功能的. spring 在扫描be ...
- springboot使用hibernate validator校验,Bean Validation校验
第一个地址:springboot使用hibernate validator校验,Bean Validation校验
- javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
项目依赖 <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifa ...
- bean validator - Hibernate validator
在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间.成本.质 ...
随机推荐
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- 动态dp 板子
动态dp 瞎扯两句吧 先从序列上理解,维护链的最大独立集. 考虑是从左边转移的,那么矩阵的转移唯一,直接放在线段树上就可以了. 放在树上的话,儿子都可以转移,把轻儿子的转移放在子链链头更新,然后每条链 ...
- [SDOI2017]硬币游戏
考虑生成函数来做 g(x)函数就是0+0*x+...+1*x^s+...+|∑|^(n-s)x^n 就是最后s位必须填这个串,但是前面随便填的方案数 然后枚举之前出现了哪个串(包括自己),如果没有相交 ...
- (转)Maven学习总结(三)——使用Maven构建项目
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(三)——使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的 ...
- python---补充django中文报错(1),Django2.7使用sys.setdefaultencoding('utf-8'),以及使用reload(sys)原因
SyntaxError at /blog/ news/story Non-ASCII character , but no encoding declared; see http://python.o ...
- Easy2Boot-小清新教程
Author:KillerLegend Date:2014.8.14 From:http://www.cnblogs.com/killerlegend/p/3913614.html 之所以说是小清新, ...
- HDU 4315 阶梯博弈变形
n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过.重叠其他棋子,谁将红色棋子移到顶部谁赢. 由于只能往上爬,所以很像阶梯博弈.这题有2个限制,棋子不能重叠,有红棋存在 首先不考虑红色棋, ...
- js 奇葩技巧之隐藏代码
昨天在群看到有人发了个文章叫<“短”化你的代码>,思路非常不错,采用unicode的零宽字符来实现字符隐藏,虽然有字符,可是你却看不见它.这篇文章详细的介绍了这种方法的实现原理,最后还给出 ...
- linux离线部署redis及redis.conf详解
一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...
- 【转】在Mac OS X 10.8中配置Apache + PHP + MySQL
CHENYILONG Blog 在Mac OS X 10.8中配置Apache + PHP + MySQL 在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apac ...