Hibernate Validator學(xué)習(xí)筆記

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

限制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;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挚躯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擦秽,更是在濱河造成了極大的恐慌码荔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件感挥,死亡現(xiàn)場離奇詭異缩搅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)触幼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門硼瓣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人置谦,你說我怎么就攤上這事堂鲤。” “怎么了媒峡?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵筑累,是天一觀的道長。 經(jīng)常有香客問我丝蹭,道長慢宗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任奔穿,我火速辦了婚禮镜沽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贱田。我一直安慰自己缅茉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布男摧。 她就那樣靜靜地躺著蔬墩,像睡著了一般译打。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拇颅,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天奏司,我揣著相機(jī)與錄音,去河邊找鬼樟插。 笑死韵洋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黄锤。 我是一名探鬼主播搪缨,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸵熟!你這毒婦竟也來了副编?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤流强,失蹤者是張志新(化名)和其女友劉穎痹届,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煮盼,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡短纵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵控。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香到。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖报破,靈堂內(nèi)的尸體忽然破棺而出悠就,到底是詐尸還是另有隱情,我是刑警寧澤充易,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布梗脾,位于F島的核電站,受9級特大地震影響盹靴,放射性物質(zhì)發(fā)生泄漏炸茧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一稿静、第九天 我趴在偏房一處隱蔽的房頂上張望梭冠。 院中可真熱鬧,春花似錦改备、人聲如沸控漠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盐捷。三九已至偶翅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碉渡,已是汗流浹背聚谁。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爆价,地道東北人垦巴。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓媳搪,卻偏偏與公主長得像铭段,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秦爆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容