Hibernate Validator用法

1、Hibernate ValiDator介绍

Bean Validation是JSR303的定义,Hibernate Validator是对BeanValidation的实现,同时附加了几个本身的注解。java

2、Hibernate Validator支持的注解 

Bean Validation 中内置的 constraint  
   
@Null   被注释的元素必须为 null  
@NotNull    被注释的元素必须不为 null  
@AssertTrue     被注释的元素必须为 true  
@AssertFalse    被注释的元素必须为 false  
@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值  
@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值  
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值  
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值  
@Size(max=, min=)   被注释的元素的大小必须在指定的范围内  
@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内  
@Past   被注释的元素必须是一个过去的日期  
@Future     被注释的元素必须是一个未来的日期  
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式  
  
Hibernate Validator 附加的 constraint  
@NotBlank(message =)   验证字符串非null,且长度必须大于0  
@Email  被注释的元素必须是电子邮箱地址  
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内  
@NotEmpty   被注释的字符串的必须非空  
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内

3、代码演示

1.pom文件git

<dependency>
      <groupId>javax.el</groupId>
      <artifactId>javax.el-api</artifactId>
      <version>2.2.4</version>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>javax.el</artifactId>
      <version>2.2.4</version>
    </dependency>

2.Beanweb

public class Student {
    interface GroupA {}

    interface GroupB {}

    interface GroupC {}

    @NotNull(message = "姓名不能为空", groups = GroupA.class)
    private String name;
    private int age;
    @Range(min = 1, max = 2, groups = GroupB.class)
    private Double money;
    @Size(min = 1, max = 3)
    private String address;

    @Size(min = 1, max = 2, groups = GroupC.class)
    private List<String> registerClass;
    @Email(groups = GroupB.class)
    private String email;

3.验证代码正则表达式

public static void main(String[] args) {
        Student student = new Student();
        //student.setName("Tom");
        student.setAddress("浙江省杭州市");
        student.setAge(101);
        student.setMoney(101D);
        student.setEmail("as");
        student.setRegisterClass(Lists.newArrayList("Englist","Math","haha"));
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();


        Set<ConstraintViolation<Student>> constraintViolationSet =  validator.validate(student, GroupA.class,GroupB.class);
        for (ConstraintViolation<Student> constraintViolation : constraintViolationSet) {
            System.out.println(constraintViolation.getPropertyPath() + constraintViolation.getMessage());
        }
    }

除了支持基本已经实现的验证功能以外,还支持分组,针对不一样组进行验证。api

 

4、Bean Validator的扩展

下面实现一个Validator,目的是检测一个List里面的全部元素在必定的范围,若是超过必定的范围或者不是Number类型的就返回提示bash

1.定义一个validator注解app

@Constraint(validatedBy = CheckListRangeValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckListRange {
    String message() default "{List里面的元素必须大于min 小于max}";

    int min() default Integer.MIN_VALUE;

    int max() default Integer.MAX_VALUE;

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

2.validator的实现ui

public class CheckListRangeValidator implements ConstraintValidator<CheckListRange, List> {

    private int min;
    private int max;

    public void initialize(CheckListRange constraintAnnotation) {
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }

    public boolean isValid(List value, ConstraintValidatorContext context) {
        for (Object object : value) {
            if (object == null || !(object instanceof Number)) {
                return false;
            }

            if (((Number)object).doubleValue() < min || ((Number)object).doubleValue() > max) {
                return false;
            }
            return true;
        }

        return false;

    }

}

3.Bean里面使用自定义validator注解this

public class Student {
    interface GroupA {}

    interface GroupB {}

    interface GroupC {}

    @NotNull(message = "姓名不能为空", groups = GroupC.class)
    private String name;
    private int age;
    @Range(min = 1, max = 2, groups = GroupB.class)
    private Double money;
    @Size(min = 1, max = 3)
    private String address;

    @Size(min = 1, max = 2, groups = GroupC.class)
    private List<String> registerClass;
    @Email(groups = GroupB.class)
    private String email;


    @CheckListRange(min = 1, max = 100, message = "List中元素必须在大于等于1,小于等于100", groups = GroupC.class)
    //当使用自定义注解的时候必定要加上@Valid否则不会被识别
    @Valid  
    private List<? extends  Number> scoreList;

}

4.检测代码spa

public class MainTest {
    public static void main(String[] args) {
        Student student = new Student();
        //student.setName("Tom");
        student.setAddress("浙江省杭州市");
        student.setAge(101);
        student.setMoney(101D);
        student.setEmail("as");
        student.setRegisterClass(Lists.newArrayList("Englist","Math","haha"));

        student.setScoreList(Lists.newArrayList(-1.1D,3D,3D,3D));

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


        Set<ConstraintViolation<Student>> constraintViolationSet =  validator.validate(student, GroupC.class);
        for (ConstraintViolation<Student> constraintViolation : constraintViolationSet) {
            System.out.println(constraintViolation.getPropertyPath() + constraintViolation.getMessage());
        }
    }
}

5.最后结果

四月 01, 2017 2:36:54 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.3.4.Final
name姓名不能为空
scoreListList中元素必须在大于等于1,小于等于100
registerClass个数必须在1和2之间

Process finished with exit code 0

5、Spring MVC中的使用

/**
     * 备注:此处@Validated(PersonAddView.class) 表示使用PersonAndView这套校验规则,若使用@Valid 则表示使用默认校验规则,

    @RequestMapping(value = "/student", method = RequestMethod.POST)
    public void addStudent(@RequestBody @Validated({GroupC.class}) Student student) {
        System.out.println(student.toString());
    }

    /**
     * 修改Person对象
     * 此处启用PersonModifyView 这个验证规则
     */
    @RequestMapping(value = "/student", method = RequestMethod.PUT)
    public void modifyStudent(@RequestBody @Validated(value = {GroupA.class}) Student student) {           System.out.println(student.toString());
    }
相关文章
相关标签/搜索