校验约束

一,认识Validator---Validation中最主要的接口

1.怎么获取一个Validator--Validation.buildDefaultValidatorFactory()

对一个实体对象验证之前首先需要有个 Validator 对象, 而这个对象是需要通过 Validation 类和
ValidatorFactory 来创建的. 最简单的方法是调用 Validation.buildDefaultValidatorFactory() 这个
静态方法

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

我们来看一下其api

1.<T> Set<ConstraintViolation<T>>     validate(T object, Class<?>... groups)
//使用 validate() 方法对一个给定的实体对象中定义的所有约束条件进行校验
2.<T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups)
//通过 validateProperty() 可以对一个给定实体对象的单个属性进行校验. 其中属性名称需要符合
JavaBean规范中定义的属性名称.
3.<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)
//通过 validateValue() 方法,你能够校验如果把一个特定的值赋给一个类的某一个属性的话,是否会
//违反此类中定义的约束条件.

我们可以发现:

所有的验证方法都有一个用来指定的可变的参数。当我们执行证操作的时候,认证组是要指定的。如果没有明确指定,则会用默认的认证组--javax.validation.groups.default

前面的Po如下:

package po;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size; /**
* Created by Administrator on 2016/7/12.
*/
public class Car {
@NotNull
private String manufacturer;
@NotNull
@Size(min = 2, max = 14)
private String licensePlate;
@Min(2)
private int seatCount;
public Car(String manufacturer, String licencePlate, int seatCount) {
this.manufacturer = manufacturer;
this.licensePlate = licencePlate;
this.seatCount = seatCount;
}
}

对于上面的三种方法分别举例如下:

 @Test
public void test1() {
Car car = new Car(null, "DD-AB-123", 4);
//validate() 方法会返回一个set的 ConstraintViolation 的实例的集合, 我们可以通过遍历它来查看哪些验证错误
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
System.out.println(constraintViolations.size());
System.out.println(constraintViolations);
}
 @Test
public void test2() {
Car car = new Car(null, "DD-AB-123", 4);
//validate() 方法会返回一个set的 ConstraintViolation 的实例的集合, 我们可以通过遍历它来查看哪些验证错误
Set<ConstraintViolation<Car>> constraintViolations = validator.validateProperty(car, "manufacturer");
System.out.println(constraintViolations.size());
System.out.println(constraintViolations);
}
 @Test
public void test3() {
//Car car = new Car(null, "DD-AB-123", 4);
//validate() 方法会返回一个set的 ConstraintViolation 的实例的集合, 我们可以通过遍历它来查看哪些验证错误
Set<ConstraintViolation<Car>> constraintViolations = validator.validateValue(Car.class, "manufacturer", null);
System.out.println(constraintViolations.size());
System.out.println(constraintViolations);
}

注意:validateProperty() 和  validateValue() 会忽略被验证属性上定义的 @Valid .

二,现在来看看究竟 ConstraintViolation 是什么了. ConstraintViolation 中包含了很多方法能够帮你快速定位究竟是什么导致了校验失败.下面列出 “ConstraintViolation 中的方法” 列出了这些方法:

--getMessage() 获取(经过翻译的)校验错误信息

--getMessageTemplate() 获取错误信息模版

--getRootBean() 获取被校验的根实体对象

--getRootBeanClass() 获取被校验的根实体类.

--getLeafBean() 如果约束是添加在一个bean(实体对象)上的,那么则返回这个bean的实例, 如果是约束是定义在一个属性上的,则返回这个属性所属的bean的实例对象.

--getPropertyPath() 从被验证的根对象到被验证的属性的路径.

--getInvalidValue() 倒是校验失败的值. passengers

--getConstraintDescriptor() 导致校验失败的约束定义.

1.验证失败提示信息解析

每个约束定义中都包含有一个用于提示验证结
果的消息模版, 并且在声明一个约束条件的时候,你可以通过这个约束中的 message 属性来重写默认
的消息模版,如果在校验的时候,这个约束条件没有通过,那
么你配置的 MessageInterpolator 会被用来当成解析器来解析这个约束中定义的消息模版, 从而得到
最终的验证失败提示信息. 这个解析器会尝试解析模版中的占位符( 大括号括起来的字符串 ).
其中, Hibernate Validator中默认的解析器 ( MessageInterpolator ) 会先在类路径下找名称为 ValidationMessages.properties 的 ResourceBundle , 然后将占位符和这个文件中定义的resource进
行匹配,如果匹配不成功的话,那么它会继续匹配Hibernate Validator自带的位于 /org/hibernate/
validator/ValidationMessages.properties 的 ResourceBundle , 依次类推,递归的匹配所有的占位符.

因为大括号{ 在这里是特殊字符,所以,你可以通过使用反斜线来对其进行转义, 例如:
•\{ 被转义成 {
•\} 被转义成 }
•\\ 被转义成 \
如果默认的消息解析器不能够满足你的需求,那么你也可以在创建 ValidatorFactory 的时候, 将其
替换为一个你自定义的 MessageInterpolator

下面是4.3.2下面ValidationMessages.properties

javax.validation.constraints.AssertFalse.message = must be false
javax.validation.constraints.AssertTrue.message = must be true
javax.validation.constraints.DecimalMax.message = must be less than or equal to {value}
javax.validation.constraints.DecimalMin.message = must be greater than or equal to {value}
javax.validation.constraints.Digits.message = numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)
javax.validation.constraints.Future.message = must be in the future
javax.validation.constraints.Max.message = must be less than or equal to {value}
javax.validation.constraints.Min.message = must be greater than or equal to {value}
javax.validation.constraints.NotNull.message = may not be null
javax.validation.constraints.Null.message = must be null
javax.validation.constraints.Past.message = must be in the past
javax.validation.constraints.Pattern.message = must match "{regexp}"
javax.validation.constraints.Size.message = size must be between {min} and {max} org.hibernate.validator.constraints.CreditCardNumber.message = invalid credit card number
org.hibernate.validator.constraints.Email.message = not a well-formed email address
org.hibernate.validator.constraints.Length.message = length must be between {min} and {max}
org.hibernate.validator.constraints.NotBlank.message = may not be empty
org.hibernate.validator.constraints.NotEmpty.message = may not be empty
org.hibernate.validator.constraints.Range.message = must be between {min} and {max}
org.hibernate.validator.constraints.SafeHtml.message = may have unsafe html content
org.hibernate.validator.constraints.ScriptAssert.message = script expression "{script}" didn't evaluate to true
org.hibernate.validator.constraints.URL.message = must be a valid URL
org.hibernate.validator.constraints.br.CNPJ.message = invalid Brazilian corporate taxpayer registry number (CNPJ)
org.hibernate.validator.constraints.br.CPF.message = invalid Brazilian individual taxpayer registry number (CPF)
org.hibernate.validator.constraints.br.TituloEleitor.message = invalid Brazilian Voter ID card numb

hibernate_validator_05的更多相关文章

随机推荐

  1. WordPress Comment Extra Fields插件‘swfupload.swf’跨站脚本漏洞

    漏洞名称: WordPress Comment Extra Fields插件‘swfupload.swf’跨站脚本漏洞 CNNVD编号: CNNVD-201308-027 发布时间: 2013-08- ...

  2. oracle中触发器中:new和:old 的使用方法--4

    转载▼     create or replace trigger TRI_PrintTest before delete or insert or update on TEST_EXAM --触发事 ...

  3. 关于DocumentCompleted事件

    关于DocumentCompleted事件,MSDN给出的解释是在文档加载完毕后执行,但是在我的程序中DocumentCompleted却被多次调用,查了一下资料,大概出现了以下几种情况. 1.Web ...

  4. UNITY3D ShadeSH9

    UNITY3D ShadeSH9 属于Irradiance environment maps 方法,可以参考DX SDK PRTDemo,里面是几乎相同的实现,总之就是解光传输的积分方程 目前主流辐射 ...

  5. 汉洛塔递归实现的思考(C语言)

    汉洛塔是古印度神话产生的智力玩具,他的玩法是,有三个柱子分别为A,B,C,A柱上面有n个盘子上面小下面大堆叠放在一起,现在要求激将A柱上的盘子全部移到C柱上面,并且一次只能移动一个盘子,必须是小盘在大 ...

  6. 【索引】Android相关的

    Eclipse开发环境 JDK的下载和安装:http://www.cnblogs.com/duxiuxing/p/4771901.html Android SDK的下载和安装:http://www.c ...

  7. 跑步进入全站 HTTPS ,这些经验值得你看看

    随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS.就在前几天,免费提供证书服务的 Let’s Encrypt 项目也正式开放测试,HTTPS 很快就会成为 WE ...

  8. Java 内省 Introspector

    操纵类的属性,有两种方法 反射 内省 面向对象的编程中,对于用户提交过来的数据,要封装成一个javaBean,也就是对象 其中Bean的属性不是由字段来决定的,而是由get和Set方法来决定的 pub ...

  9. 七牛云- Java 端 使用

    项目 中需要把 图片放到 图片服务器上托管, 所以使用了七牛, 注册之后每个月 有免费100 万 次get请求,先说说怎么使用: 1 .注册, 获取自己的AK,SK

  10. 搜索-hdu-3720-Arranging Your Team

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3720 题目大意: 有23个人,告诉每个人的名字,能力值,以及踢球的位置.要求选出1个守门员,2个前锋 ...