Hibernate Validator学习笔记

Hibernate Validator

1.什么是Hibernate Validator?

平时项目中,难免需要对参数 进行一些参数正确性的校验,这些校验出现在业务代码中,让我们的业务代码显得臃肿,而且,频繁的编写这类参数校验代码很无聊。Hibernate Validator 框架刚好解决了这些问题,可以用优雅的方式实现参数的校验,让业务代码和校验逻辑分开,同时也不再编写重复的校验逻辑。
Hibernate Validator是Bean Validation的参考实现。Hibernate Validator 提供了 JSR 303 规范中所有内置Constraint的实现,除此之外还有一些附加的Constraint。
Bean Validation是Java定义的一套基于注解的数据校验规范。它定义了一套元数据模型和API对JavaBean实现校验,默认是以注解作为元数据,可以通过XML重写或者拓展元数据,通常来说注解的方式可以实现比较简单逻辑的校验,而复杂校验就需要通过XML来描述。

2.Hibernate Validator提供了哪些内置的约束(Constraint)?

@AssertFalse

判断是否为false

@AssertTrue

判断是否为true

@DecimalMax(value=, inclusive=)

限制数字类型的最大值,inclusive为true时为闭区间

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持Number和javax.money.MonetaryAmount的任何子类型

@DecimalMin(value=, inclusive=)

限制数字类型的最小值,inclusive为true时为闭区间

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持Number和javax.money.MonetaryAmount的任何子类型

@Digits(integer=, fraction=)

限制全数字,integer为整数位,fraction为小数位

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持Number和javax.money.MonetaryAmount的任何子类型

@Email

限制Email格式的字符串

支持的数据类型String

@Future

限制日期为未来

支持的数据类型java.util.Date, java.util.Calendar, java.time.Instant, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.MonthDay, java.time.OffsetDateTime, java.time.OffsetTime, java.time.Year, java.time.YearMonth, java.time.ZonedDateTime, java.time.chrono.HijrahDate, java.time.chrono.JapaneseDate, java.time.chrono.MinguoDate, java.time.chrono.ThaiBuddhistDate

@FutureOrPresent

限制日期为现在或未来

支持的数据类型java.util.Date, java.util.Calendar, java.time.Instant, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.MonthDay, java.time.OffsetDateTime, java.time.OffsetTime, java.time.Year, java.time.YearMonth, java.time.ZonedDateTime, java.time.chrono.HijrahDate, java.time.chrono.JapaneseDate, java.time.chrono.MinguoDate, java.time.chrono.ThaiBuddhistDate

@Max(value=)

限制数字类型的最大值

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@Min(value=)

限制数字类型的最小值

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@NotBlank

限制字符串不能为null,不能为空字符串,不能为空格(trim)

支持的数据类型为String

@NotEmpty

限制字符串或集合不能为null或空

支持的数据类型为String,集合,Map,数组

@NotNull

限制不能为空

@Negative

限制数字类型为负数

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@NegativeOrZero

限制数字类型为负数或零

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@Null

限制为null

@Past

限制日期为过去

支持的数据类型java.util.Date, java.util.Calendar, java.time.Instant, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.MonthDay, java.time.OffsetDateTime, java.time.OffsetTime, java.time.Year, java.time.YearMonth, java.time.ZonedDateTime, java.time.chrono.HijrahDate, java.time.chrono.JapaneseDate, java.time.chrono.MinguoDate, java.time.chrono.ThaiBuddhistDate

@PastOrPresent

限制日期为过去或现在

支持的数据类型java.util.Date, java.util.Calendar, java.time.Instant, java.time.LocalDate, java.time.LocalDateTime, java.time.LocalTime, java.time.MonthDay, java.time.OffsetDateTime, java.time.OffsetTime, java.time.Year, java.time.YearMonth, java.time.ZonedDateTime, java.time.chrono.HijrahDate, java.time.chrono.JapaneseDate, java.time.chrono.MinguoDate, java.time.chrono.ThaiBuddhistDate

@Pattern(regex=, flags=)

限制字符串是否匹配正则表达式,flag为true,匹配视为有效,flag为false,匹配视为无效

支持的数据类型为String

@Positive

限制数字类型为正数

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@PositiveOrZero

限制数字类型为正数或零

支持的数据类型BigDecimal,BigInteger,CharSequence,byte,short,int,long和基本数据类型对应的包装类型;Hibernate Validator额外支持数字String和Number和javax.money.MonetaryAmount的任何子类型

@Size(min=, max=)

限制对象的长度(size)在最小值和最大值之间(闭区间)

支持的数据类型为String,集合,Map,数组

@Length(min=, max=)

限制字符串的最大长度和最小长度

支持的数据类型为String

@Range(min=, max=)

限制对象介于最小值和最大值之间(闭区间)

支持的数据类型BigDecimal,BigInteger,String,byte,short,int,long和基本数据类型对应的包装类型

@UniqueElements

限制集合仅包含唯一元素,通过equals方法判断

支持的数据类型为集合

……

3.如何自定义一个Hibernate Validator约束注解?

先定义一个注解(@Interface)

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TestConstraintValidator.class)
public @interface Test {

    String message() default "test";

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

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

再定义一个约束验证器,实现ConstraintValidator接口,重写isValid方法,将具体的校验逻辑写在该方法体内

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class TestConstraintValidator implements ConstraintValidator<Test, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return true;
    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容