Hibernate Validator
1.什么是Hibernate Validator?
平時項(xiàng)目中卵佛,難免需要對參數(shù) 進(jìn)行一些參數(shù)正確性的校驗(yàn)学赛,這些校驗(yàn)出現(xiàn)在業(yè)務(wù)代碼中河哑,讓我們的業(yè)務(wù)代碼顯得臃腫财岔,而且风皿,頻繁的編寫這類參數(shù)校驗(yàn)代碼很無聊。Hibernate Validator 框架剛好解決了這些問題匠璧,可以用優(yōu)雅的方式實(shí)現(xiàn)參數(shù)的校驗(yàn)桐款,讓業(yè)務(wù)代碼和校驗(yàn)邏輯分開,同時也不再編寫重復(fù)的校驗(yàn)邏輯夷恍。
Hibernate Validator是Bean Validation的參考實(shí)現(xiàn)魔眨。Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置Constraint的實(shí)現(xiàn),除此之外還有一些附加的Constraint裁厅。
Bean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗(yàn)規(guī)范冰沙。它定義了一套元數(shù)據(jù)模型和API對JavaBean實(shí)現(xiàn)校驗(yàn)侨艾,默認(rèn)是以注解作為元數(shù)據(jù)执虹,可以通過XML重寫或者拓展元數(shù)據(jù),通常來說注解的方式可以實(shí)現(xiàn)比較簡單邏輯的校驗(yàn)唠梨,而復(fù)雜校驗(yàn)就需要通過XML來描述袋励。
2.Hibernate Validator提供了哪些內(nèi)置的約束(Constraint)?
@AssertFalse
判斷是否為false
@AssertTrue
判斷是否為true
@DecimalMax(value=, inclusive=)
限制數(shù)字類型的最大值,inclusive為true時為閉區(qū)間
支持的數(shù)據(jù)類型BigDecimal茬故,BigInteger盖灸,CharSequence,byte磺芭,short赁炎,int,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型钾腺;Hibernate Validator額外支持Number和javax.money.MonetaryAmount的任何子類型
@DecimalMin(value=, inclusive=)
限制數(shù)字類型的最小值徙垫,inclusive為true時為閉區(qū)間
支持的數(shù)據(jù)類型BigDecimal,BigInteger放棒,CharSequence姻报,byte,short间螟,int吴旋,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型;Hibernate Validator額外支持Number和javax.money.MonetaryAmount的任何子類型
@Digits(integer=, fraction=)
限制全數(shù)字厢破,integer為整數(shù)位荣瑟,fraction為小數(shù)位
支持的數(shù)據(jù)類型BigDecimal,BigInteger摩泪,CharSequence褂傀,byte,short加勤,int仙辟,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型;Hibernate Validator額外支持Number和javax.money.MonetaryAmount的任何子類型
限制Email格式的字符串
支持的數(shù)據(jù)類型String
@Future
限制日期為未來
支持的數(shù)據(jù)類型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
限制日期為現(xiàn)在或未來
支持的數(shù)據(jù)類型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=)
限制數(shù)字類型的最大值
支持的數(shù)據(jù)類型BigDecimal鳄梅,BigInteger叠国,CharSequence,byte戴尸,short粟焊,int,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型孙蒙;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@Min(value=)
限制數(shù)字類型的最小值
支持的數(shù)據(jù)類型BigDecimal项棠,BigInteger,CharSequence挎峦,byte香追,short,int坦胶,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型透典;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@NotBlank
限制字符串不能為null晴楔,不能為空字符串,不能為空格(trim)
支持的數(shù)據(jù)類型為String
@NotEmpty
限制字符串或集合不能為null或空
支持的數(shù)據(jù)類型為String峭咒,集合税弃,Map,數(shù)組
@NotNull
限制不能為空
@Negative
限制數(shù)字類型為負(fù)數(shù)
支持的數(shù)據(jù)類型BigDecimal凑队,BigInteger则果,CharSequence,byte漩氨,short短条,int,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型才菠;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@NegativeOrZero
限制數(shù)字類型為負(fù)數(shù)或零
支持的數(shù)據(jù)類型BigDecimal茸时,BigInteger,CharSequence赋访,byte可都,short,int蚓耽,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型渠牲;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@Null
限制為null
@Past
限制日期為過去
支持的數(shù)據(jù)類型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
限制日期為過去或現(xiàn)在
支持的數(shù)據(jù)類型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=)
限制字符串是否匹配正則表達(dá)式,flag為true步悠,匹配視為有效签杈,flag為false,匹配視為無效
支持的數(shù)據(jù)類型為String
@Positive
限制數(shù)字類型為正數(shù)
支持的數(shù)據(jù)類型BigDecimal鼎兽,BigInteger答姥,CharSequence,byte谚咬,short鹦付,int,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型择卦;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@PositiveOrZero
限制數(shù)字類型為正數(shù)或零
支持的數(shù)據(jù)類型BigDecimal敲长,BigInteger,CharSequence秉继,byte祈噪,short,int尚辑,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型辑鲤;Hibernate Validator額外支持?jǐn)?shù)字String和Number和javax.money.MonetaryAmount的任何子類型
@Size(min=, max=)
限制對象的長度(size)在最小值和最大值之間(閉區(qū)間)
支持的數(shù)據(jù)類型為String,集合腌巾,Map遂填,數(shù)組
@Length(min=, max=)
限制字符串的最大長度和最小長度
支持的數(shù)據(jù)類型為String
@Range(min=, max=)
限制對象介于最小值和最大值之間(閉區(qū)間)
支持的數(shù)據(jù)類型BigDecimal铲觉,BigInteger澈蝙,String吓坚,byte,short灯荧,int礁击,long和基本數(shù)據(jù)類型對應(yīng)的包裝類型
@UniqueElements
限制集合僅包含唯一元素,通過equals方法判斷
支持的數(shù)據(jù)類型為集合
……
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 { };
}
再定義一個約束驗(yàn)證器哆窿,實(shí)現(xiàn)ConstraintValidator接口,重寫isValid方法厉斟,將具體的校驗(yàn)邏輯寫在該方法體內(nèi)
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;
}
}