zoukankan      html  css  js  c++  java
  • hibernate_validator_05

    校验约束

    一,认识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;
        }
    }
    View Code

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

     @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
  • 相关阅读:
    第五节: EF高级属性(一) 之 本地缓存、立即加载、延迟加载(不含导航属性)
    第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法
    第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
    Android ListView常见配置说明
    如何配置IIS使其支持APK文件的下载
    Android scrollview和GridView混合使用
    WCF配置后支持通过URL进行http方式调用
    转战博客园
    Android Intent参数传递
    Android 使用SQLite
  • 原文地址:https://www.cnblogs.com/wangyang108/p/5668025.html
Copyright © 2011-2022 走看看