文档章节

Hibernate Validator用法

Lubby
 Lubby
发布于 2017/04/01 14:45
字数 1101
阅读 224
收藏 0

一、Hibernate ValiDator介绍

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

二、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=)  被注释的元素必须在合适的范围内  

三、代码演示

1.pom文件

   <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.Bean

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());
        }
    }

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

 

四、Bean Validator的扩展

下面实现一个Validator,目的是检测一个List里面的所有元素在一定的范围,如果超过一定的范围或者不是Number类型的就返回提示

1.定义一个validator注解

@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的实现

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注解

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.检测代码

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

五、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());
    }

 

© 著作权归作者所有

Lubby
粉丝 55
博文 117
码字总数 67088
作品 0
杭州
程序员
私信 提问
Hibernate Validator的应用实践

官方文档 Hibernate Validation目前最新的稳定版本是:5.1.3。 下载地址 官网地址 官方英文使用手册 官方中文使用手册地址 (中文版目前最新的是4.3版本) 具体用法可以参考官方文档。 1.依赖包...

无名小小伟
2017/11/30
0
0
Hibernate Validator 6.0.0.Alpha2 改进对 Bean Validation 2.0 的支持

Hibernate Validator 6.0.0.Alpha2 发布了。Hibernate Validator 6 将成为 Bean Validation 2.0 的参考实现。此 Alpha2 版本与 Bean Validation 规范的 2.0.0.Alpha2 版本协调。 请注意,Hib......

局长
2017/03/31
981
3
Hibernate Validator 5.3.2 发布

Hibernate Validator 5.3.2 发布了。 Hibernate Validator 就是用 Annotations 给类或者类的属性加上约束(constraint)的一个框架。该框架是十分容易的操作。Validator 是一个验证框架 不需要...

淡漠悠然
2016/11/14
1K
2
Hibernate Validator 5.2.0.Beta1 发布

Hibernate Validator 5.2.0.Beta1 发布,此版本解决了 30 个 issues,值得关注的新特性: Ability to provide external ClassLoader Hibernate Validator features.xml for Apache Karaf Pr......

叶秀兰
2015/02/28
802
1
Hibernate Validator 5.1.0.CR1 发布

Hibernate Validator 5.1.0.CR1 发布,此版本离最终版本又更近了一步,包括了一些调整和 bug 修复: addressed issues with the CDI integration (HV-858) EL message interpolation (HV-83...

NinjaSquid
2014/02/19
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部