hibernate validator 功能

在开发中经常做一些字段校验的功能,比如非空,长度限制,邮箱验证等等,为了省掉这种冗长繁琐的操作,hibernate validator提供了一套精简的注释方案以实现这些基本校验。

注解说明

Annotation Type

Description   (import javax.validation.constraints.*)

AssertFalse

被注释的元素必须为boolean,且为false

AssertTrue

被注释的元素必须为boolean,且为true

DecimalMax

被注释的元素必须为数字,且小于等于最大值

DecimalMin

被注释的元素必须为数字,且大于等于最小值

Digits

被注释的元素必须为数字,且精度在指定的整数和小数范围内

Future

被注释的元素必须为日期且大于当前时间(是未来的时间)

Max

被注释的元素必须是数字,且小于等于最大值

Min

被注释的元素必须是数字,且大于等于最小值

NotNull

被注释的元素必须不为 null

Null

被注释的元素必须为 null

Past

被注释的元素必须为日期且小于当前时间(是过去的时间)

Pattern

被注释的元素必须字符串,且符合指定正则表达式,如果为null则不校验

Size

被注释的元素必须是字符串,长度大于等于min值,小于等于max值

Annotation Type

Description   (import org.hibernate.validator.constraints.*)

Email

被注释的元素必须是电子邮箱地址

Length

被注释的字符串的大小必须在指定的范围内

NotBlank

被注释的字符串必须非空

NotEmpty

被注释的字符串或列表的必须非空

Range

被注释的元素必须在合适的范围内

URL

被注释的字符串的必须符合url地址格式

使用样例

工具类ValidationTool.java

package hibernate.validator;
import java.util.Set; import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.ValidatorFactory; /**
* HibernateValidator工具
* @author King
*
*/
public class ValidationTool { private static Validator validator; static {
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
validator = vf.getValidator();
} public static <T> void validate(T t) throws ValidationException {
Set<ConstraintViolation<T>> set = validator.validate(t);
if (set.size() > 0) {
StringBuilder errorBuilder = new StringBuilder();
for (ConstraintViolation<T> val : set) {
errorBuilder.append(val.getMessage() + ";");
}
throw new ValidationException(errorBuilder.toString());
}
}
}

学生类Student.java

package hibernate.validator;

import java.util.Date;

import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Future;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size; import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.URL; /**
* 学生类
*
* @author King
*/
public class Student { @AssertTrue(message = "必须为女孩")
// @AssertFalse(message = "必须为男孩")
Boolean girlFlag; // 以下三者酌情取其一
// 仅针对String,含空白字符的String也是不符合规则的,如" \t "也是不规范的
@NotBlank(message = "名字不能为空")
// 不能为null或者长度为0,可以应用于String类、Collection、Map、数组,(String、Collection、Map的isEmpty()方法)
@NotEmpty(message = "名字不能为空")
// 不能为null
@NotNull(message = "名字不能为空")
String name; @Min(value = 1, message = "年龄不得小于1岁")
@Max(value = 200, message = "年龄不得大于200岁")
Integer age; @Digits(integer = 2, fraction = 2, message = "身高精度为XX.XX米")
Double height; @DecimalMin(value = "3.0", message = "最轻为3.0斤")
@DecimalMax(value = "300.0", message = "最重为300.0斤")
Double weight; // 如果是null则不校验,如果不是null,则校验
@Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$", message = "出生日期格式yyyy-MM-dd不正确")
String birthDateStr; // 如果是null则不校验,如果不是null,则校验
@Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$", message = "数学考试开始时间格式yyyy-MM-dd HH:mm:ss不正确")
String mathExamTime; @Past(message = "出生日期应为过去时间")
Date birthDate; @Future(message = "毕业时间应为将来时间")
Date graduateDate; @Size(min = 2, max = 20, message = "地址长度必须介于2到20之间")
String address; @Email(message = "邮件格式不合法")
String email; @Length(min = 1, max = 100, message = "兴趣爱好介绍长度必须介于1到100之间")
String hobby; @URL(message = "链接地址不是合法的url")
String link; @Range(min = 0, max = 10, message = "兄弟个数介于0到10个字符之间")
int brotherNumber; String other; // /////////////////////// public static void main(String[] args) {
StudentTest.main(null);
} public int getBrotherNumber() {
return brotherNumber;
} public void setBrotherNumber(int brotherNumber) {
this.brotherNumber = brotherNumber;
} public Boolean getGirlFlag() {
return girlFlag;
} public void setGirlFlag(Boolean girlFlag) {
this.girlFlag = girlFlag;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Double getHeight() {
return height;
} public void setHeight(Double height) {
this.height = height;
} public Double getWeight() {
return weight;
} public void setWeight(Double weight) {
this.weight = weight;
} public String getBirthDateStr() {
return birthDateStr;
} public void setBirthDateStr(String birthDateStr) {
this.birthDateStr = birthDateStr;
} public String getMathExamTime() {
return mathExamTime;
} public void setMathExamTime(String mathExamTime) {
this.mathExamTime = mathExamTime;
} public Date getBirthDate() {
return birthDate;
} public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
} public Date getGraduateDate() {
return graduateDate;
} public void setGraduateDate(Date graduateDate) {
this.graduateDate = graduateDate;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getHobby() {
return hobby;
} public void setHobby(String hobby) {
this.hobby = hobby;
} public String getLink() {
return link;
} public void setLink(String link) {
this.link = link;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getOther() {
return other;
} public void setOther(String other) {
this.other = other;
}
}

学生测试类

package hibernate.validator;

import java.util.Date;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory; import org.junit.BeforeClass; import com.isoftstone.pcis.util.ValidationTool; public class StudentTest {
private static Validator validator; /**
* 生成validator校验器
*/
@BeforeClass
public static void setUpValidator() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
} /**
* 验证整个Student
*/ // @Test
// public void test() { public static void main(String[] args) {
Student stu = new Student(); stu.setGirlFlag(true);
stu.setName("Pricess");
stu.setAge(18);
stu.setHeight(1.78d);
stu.setWeight(120.0);
stu.setBirthDateStr("2001-01-06");
stu.setMathExamTime("2018-07-08 09:00:00");
stu.setBirthDate(new Date(System.currentTimeMillis() - 10000));
stu.setGraduateDate(new Date(System.currentTimeMillis() + 100000));
stu.setAddress("浙江杭州");
stu.setEmail("12345 qq.com");//故意不加@,以验证异常效果
stu.setHobby("音乐");
stu.setLink("http://www.cnblogs.com/whatlonelytear/");
stu.setBrotherNumber(1); ValidationTool.validate(stu); } }

运行console打印语句

Exception in thread "main" javax.validation.ValidationException: 邮件格式不合法;
at com.isoftstone.pcis.util.ValidationTool.validate(ValidationTool.java:)
at hibernate.validator.StudentTest.main(StudentTest.java:)

进阶知识

以上hibernate的基本使用已完全可以满足日常需要, 如果有更进一步的规则, 可以参考以下链接(内含自定义规则 spring集成 等)

Hibernate validator使用和自定义validator及整合Spring MVC--https://blog.csdn.net/xulianboblog/article/details/51694924

Spring MVC 数据校验@Valid--https//www.cnblogs.com/happyflyingpig/p/8022881.html

参考链接

java使用validator进行校验--https://blog.csdn.net/dream_broken/article/details/53584169

hibernate validator【原】的更多相关文章

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

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

  2. Hibernate Validator验证标签说明

    Hibernate Validator是JSR-303的一个实现. 在FormBean里添加Hibernate Validator的注解,与定义一个校验类的做法相比.注解更加简洁.灵活. Bean V ...

  3. 非WEB项目中引入Hibernate Validator

    前言: 网上一些朋友分享了关于hibernate-validator的使用方法,但是不是缺少关联库信息,就是提供的参考代码中缺少自定类. 希望我这一篇博客能够让你顺利的跑出预期的结果. 如果有错,可以 ...

  4. Hibernate Validator

    http://docs.jboss.org/hibernate/validator/4.2/reference/zh-CN/html_single/#example-group-interfaces

  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验证

    spring-mvc配置 <mvc:annotation-driven validator="validator" /> <bean id="valid ...

  7. springMvc 支持hibernate validator

    SpringMVC 支持Hibernate Validator 发表于9个月前(2014-08-04 11:34)   阅读(1780) | 评论(0) 11人收藏此文章, 我要收藏 赞0 5月23日 ...

  8. SpringMVC利用Hibernate validator做字段验证

    1.添加Hiberbate validator相关的jar包 2.字需要验证的formbean 上添加验证的注解,内置注解有: dBean Validation 中内置的 constraint @Nu ...

  9. JSR303的数据校验-Hibernate Validator方式实现

    1.什么是JSR303? JSR303是java为bean数据合法性校验所提供的一个标准规范,叫做Bean Validation. Bean Validation是一个运行时的数据校验框架,在验证之后 ...

随机推荐

  1. POJ 2449 Remmarguts' Date (算竞进阶习题)

    A* + dijkstra/spfa 第K短路的模板题,就是直接把最短路当成估价函数,保证估价函数的性质(从当前状态转移的估计值一定不大于实际值) 我们建反图从终点跑最短路,就能求出从各个点到终点的最 ...

  2. gulp 技巧

    install npm install --save-dev jshint gulp-jshint 压缩js npm install --save-dev gulp-minify-css xxCSS ...

  3. project 2013 显示标题

    1.分析 右键只能插入任务,不能插入标题,而插入任务会被编号,目前只能在打印设置标题,不能在编辑界面显示标题的,或者使用最高级任务的方式 2.解决 文件,打印,页面设置,页眉,居中,输入标题,这样打印 ...

  4. MT【256】2016四川高考解答压轴题

    (2016四川高考数学解答压轴题)设函数$f(x)=ax^2-a-\ln x,a\in R$. 1)讨论$f(x)$的单调性;2)确定$a$的所有可能值,使得$f(x)>\dfrac{1}{x} ...

  5. Java抽象类简单学习

    使用抽象类应该注意的几个要点: 包含一个或者多个抽象方法的类必须被声明为抽象类. 将类声明为抽象类,不一定含有抽象方法. 通常认为,在抽象类中不应该包括具体方法,建议尽量将通用的域和方法放在超类中. ...

  6. LVS-Keepalived高可用集群(DR)

    LVS-DR+Keepalived高可用集群 -------client------------------主LVS--------------------从LVS------------------ ...

  7. Mysql连接报错:1130 - Host ‘118.111.111.111’ is not allowed to connect to this MariaDB server

    这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户),下面将记录我遇到问题的过程及解决的方法. 在搭建完LNMP环境后用Navicate连接出错 遇到这个问题 ...

  8. 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)

    链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  9. 临时处理小记:把Numpy的narray二进制文件转换成json文件

    临时处理一个Numpy的二进制文件,分析知道里面是dict类型,简单小记一下,如果Numpy和Python基础不熟悉可以看我之前写的文章 In [1]: %%time import numpy as ...

  10. 洛谷P3185 分裂游戏

    解:这个毒瘤...... 我们首先发现每一堆的个数对操作不产生影响,每个操作都是针对单个石子的. 所以等价于每个石子都是一个独立的游戏.把它们异或起来作为sg函数值即可. 单个石子的sg值,直接暴力计 ...