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格式的字符串
支持的数据类型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;
}
}