当前位置 : 首页 » 文章分类 :  开发  »  Java-Bean Validation

Java-Bean Validation

JSR-303 Java Bean Validation 学习笔记

JSR303 规范(Bean Validation 规范)提供了对 Java EE 和 Java SE 中的 Java Bean 进行验证的方式。该规范主要使用注解的方式来实现对 Java Bean 的验证功能

Bean Validation 规范对约束的定义包括两部分,一是约束注解,类似 @NotNull 就是约束注解;二是约束验证器,每一个约束注解都存在对应的约束验证器,约束验证器用来验证具体的 Java Bean 是否满足该约束注解声明的条件。


约束注解

JSR303 规范默认提供了几种约束注解的定义

约束注解名称 约束注解说明
@Null 验证对象是否为空
@NotNull 验证对象是否为非空
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMin 验证 Number 和 String 对象是否大等于指定的值,小数存在精度
@DecimalMax 验证 Number 和 String 对象是否小等于指定的值,小数存在精度
@Size 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Digits 验证 Number 和 String 的构成是否合法
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则

自定义约束注解

一个典型的约束注解的定义应该至少包括如下内容:

@Target({ })   // 约束注解应用的目标元素类型
@Retention()   // 约束注解应用的时机
@Constraint(validatedBy ={})  // 与约束注解关联的验证器
public @interface ConstraintName{
  String message() default " ";   // 约束注解验证时的输出消息
  Class<?>[] groups() default { };  // 约束注解在验证时所属的组别
  Class<? extends Payload>[] payload() default { }; // 约束注解的有效负载
}

比如验证字符串非空的约束注解@NotEmpty的定义如下:

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {NotEmptyValidator.class})
public @interface NotEmpty {
  String message() default "this string may be empty";
  Class<?>[] groups() default { };
  Class<? extends Payload>[] payload() default {};
}

约束验证器

约束注解定义完成后,需要同时实现与该约束注解关联的验证器。约束验证器的实现需要扩展 JSR-303 规范提供的接口 javax.validation.ConstraintValidator

public interface ConstraintValidator<A extends Annotation, T> {
  void initialize(A constraintAnnotation);
  boolean isValid(T value, ConstraintValidatorContext context);
}

该接口有两个方法,方法 initialize 对验证器进行实例化,它必须在验证器的实例在使用之前被调用,并保证正确初始化验证器,它的参数是约束注解;方法 isValid 是进行约束验证的主体方法,其中 value 参数代表需要验证的实例,context 参数代表约束执行的上下文环境。

字符串非空约束注解@NotEmpty对应的验证器的实现如下:

public class NotEmptyValidator implements ConstraintValidator<NotEmpty, String>{
  public void initialize(NotEmpty parameters) {}

  public boolean isValid(String string, ConstraintValidatorContext constraintValidatorContext) {
    if (string == null)
      return false;
    else if(string.length()<1)
      return false;
    else
      return true;
    }
}

Bean Validation 技术规范特性概述(IBM高质量文章,介绍的非常详细、全面、准确、易懂)
https://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/index.html

JSR 303 - Bean Validation 介绍及最佳实践
https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html


Hibernate Validator简介与使用

Hibernate Validator 4.0 是对 JSR-303 规范的实现

Hibernate Validator 附加的约束注解:

约束注解名称 约束注解说明
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内

添加Maven依赖

validation-api是javax规范包。
hibernate-validator是hibernate提供的实现包。

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.2.1.Final</version>
</dependency>

Spring MVC之@Valid校验
https://my.oschina.net/manmao/blog/749829


上一篇 Apache-Commons-Lang使用笔记

下一篇 SpringBoot-@Async异步调用

阅读
1,010
阅读预计4分钟
创建日期 2018-06-28
修改日期 2018-06-25
类别
标签
百度推荐