欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

hibernate-validator改進(jìn)校驗(yàn)框架validator?v0.4使用

 更新時(shí)間:2023年03月21日 09:15:11   作者:老馬嘯西風(fēng)  
這篇文章主要為大家介紹了改進(jìn)?hibernate-validator,新一代校驗(yàn)框架?validator?使用介紹?v0.4,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

項(xiàng)目介紹

java 開(kāi)發(fā)中,參數(shù)校驗(yàn)是非常常見(jiàn)的需求。但是 hibernate-validator 在使用過(guò)程中,依然會(huì)存在一些問(wèn)題。

validator 在 hibernate-validator 等校驗(yàn)工具之上,做了一些改進(jìn),使其使用更加便捷優(yōu)雅,進(jìn)一步提升工作效率。

變更日志

特性

支持 fluent-validation

支持 jsr-303 注解

支持 i18n

支持用戶自定義策略

支持用戶自定義注解

支持針對(duì)屬性的校驗(yàn)

支持過(guò)程式編程與注解式編程

支持指定校驗(yàn)生效的條件

創(chuàng)作目的

hibernate-validator 無(wú)法滿足的場(chǎng)景

如今 java 最流行的 hibernate-validator 框架,但是有些場(chǎng)景是無(wú)法滿足的。

比如:

  • 驗(yàn)證新密碼和確認(rèn)密碼是否相同。(同一對(duì)象下的不同屬性之間關(guān)系)
  • 當(dāng)一個(gè)屬性值滿足某個(gè)條件時(shí),才進(jìn)行其他值的參數(shù)校驗(yàn)。
  • 多個(gè)屬性值,至少有一個(gè)不能為 null

其實(shí),在對(duì)于多個(gè)字段的關(guān)聯(lián)關(guān)系處理時(shí),hibernate-validator 就會(huì)比較弱。

本項(xiàng)目結(jié)合原有的優(yōu)點(diǎn),進(jìn)行這一點(diǎn)的功能強(qiáng)化。

validation-api 過(guò)于復(fù)雜

validation-api 提供了豐富的特性定義,也同時(shí)帶來(lái)了一個(gè)問(wèn)題。

實(shí)現(xiàn)起來(lái),特別復(fù)雜。

然而我們實(shí)際使用中,常常不需要這么復(fù)雜的實(shí)現(xiàn)。

validator-api 提供了一套簡(jiǎn)化很多的 api,便于用戶自行實(shí)現(xiàn)。

自定義缺乏靈活性

hibernate-validator 在使用中,自定義約束實(shí)現(xiàn)是基于注解的,針對(duì)單個(gè)屬性校驗(yàn)不夠靈活。

本項(xiàng)目中,將屬性校驗(yàn)約束和注解約束區(qū)分開(kāi),便于復(fù)用和拓展。

過(guò)程式編程 vs 注解式編程

hibernate-validator 核心支持的是注解式編程,基于 bean 的校驗(yàn)。

一個(gè)問(wèn)題是針對(duì)屬性校驗(yàn)不靈活,有時(shí)候針對(duì) bean 的校驗(yàn),還是要自己寫(xiě)判斷。

本項(xiàng)目支持 fluent-api 進(jìn)行過(guò)程式編程,同時(shí)支持注解式編程。

盡可能兼顧靈活性與便利性。

快速開(kāi)始

準(zhǔn)備工作

JDK1.7+

Maven 3.X+

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>validator-core</artifactId>
    <version>0.4.0</version>
</dependency>

快速入門(mén)

定義對(duì)象

第一步,我們定義一個(gè)常見(jiàn)的 java bean 對(duì)象,可以指定內(nèi)置的注解。

支持 jsr-303 注解和 hibernate-validator 的注解。

public class User {
    /**
     * 名稱(chēng)
     */
    @HasNotNull({"nickName"})
    private String name;
    /**
     * 昵稱(chēng)
     */
    private String nickName;
    /**
     * 原始密碼
     */
    @AllEquals("password2")
    private String password;
    /**
     * 新密碼
     */
    private String password2;
    /**
     * 性別
     */
    @Ranges({"boy", "girl"})
    private String sex;
    /**
     * 失敗類(lèi)型枚舉
     */
    @EnumRanges(FailTypeEnum.class)
    private String failType;
    //getter & setter
}

ValidHelper 工具方法

ValidHelper 作為統(tǒng)一封裝的工具類(lèi),提供了 java bean 校驗(yàn)常見(jiàn)的方法。

方法列表:

序號(hào)方法返回值說(shuō)明
1failOver(Object object)IResult全部驗(yàn)證后返回
2failFast(Object object)IResult快速驗(yàn)證后返回
3failOverThrow(Object object)void全部驗(yàn)證后返回-未通過(guò)拋出 ValidRuntimeException 異常
4failFastThrow(Object object)void快速驗(yàn)證后返回-未通過(guò)拋出 ValidRuntimeException 異常

使用起來(lái)很簡(jiǎn)單,我們以 failFast 為例:

// 對(duì)象定義
User user = new User();
user.sex("what").password("old").password2("new");
// 調(diào)用方法
IResult result = ValidHelper.failFast(user);

結(jié)果:

DefaultResult{pass=false, notPassList=[DefaultConstraintResult{pass=false, message='name: 值 &lt;null&gt; 不是預(yù)期值', value=null, constraint='HasNotNullConstraint', expectValue='', fieldName='name'}], allList=null}
  • IResult 方法說(shuō)明

返回值實(shí)現(xiàn)默認(rèn)為 DefaultResult,接口 IResult 屬性如下:

public interface IResult {
    /**
     * 是否全部通過(guò)驗(yàn)證
     * @return 是否
     * @since 0.1.0
     */
    boolean pass();
    /**
     * 未通過(guò)的列表信息
     * @return 驗(yàn)證結(jié)果
     * @since 0.1.0
     */
    List<IConstraintResult> notPassList();
    /**
     * 所有的驗(yàn)證結(jié)果列表
     * @return 所有的驗(yàn)證結(jié)果
     * @since 0.1.0
     */
    List<IConstraintResult> allList();
    /**
     * 輸出信息到控臺(tái)
     * (1)主要是為了方便調(diào)整
     * (2)該功能其實(shí)可以做增強(qiáng),比如輸出到文件/數(shù)據(jù)庫(kù)等等。
     * @return this
     * @since 0.0.6
     */
    IResult print();
    /**
     * 對(duì)于未通過(guò)的信息,
     * (1)未通過(guò)的界定。
     *  {@link IConstraintResult#pass()} 為 false
     *
     * (2)內(nèi)容信息
     * 拋出運(yùn)行時(shí)異常 {@link com.github.houbb.validator.api.exception.ValidRuntimeException},異常信息為 {@link IConstraintResult#message()} 消息
     * (3)內(nèi)容限定
     *  為了避免異常內(nèi)容過(guò)多,只拋出第一條即可。
     *  (4)改方法的增強(qiáng)空間
     *  4.1 可以指定什么情況下拋出異常
     *  4.2 拋出異常的信息和類(lèi)別
     *
     * @return this
     * @since 0.0.6
     */
    IResult throwsEx();
}

注解說(shuō)明

java bean 的校驗(yàn),基于注解是比較方便的。和 hibernate-validator 使用類(lèi)似,這里介紹下常見(jiàn)的注解。

內(nèi)置約束注解

內(nèi)置注解如下:

序號(hào)注解value()說(shuō)明
1@AllEqualsString[]當(dāng)前字段及其指定的字段 全部相等
2@EnumRangesClass<? extends Enum>當(dāng)前字段必須在枚舉值指定的范圍內(nèi)
3@HasNotNullString[]當(dāng)前字段及其指定的字段 至少有一個(gè)不為 null
4@RangesString[]當(dāng)前字段必須在指定的范圍內(nèi)

JSR-303 + hibernate-validator 約束注解支持

序號(hào)注解說(shuō)明
1@AssertTrue為 true 約束條件
2@AssertFalse為 false 約束條件
3@Null為 null 約束條件
4@NotNull不為 null 約束條件
5@Past是否在當(dāng)前時(shí)間之前約束條件
6@Future是否在當(dāng)前時(shí)間之后約束條件
7@Pattern正則表達(dá)式約束條件
8@Size在指定范圍內(nèi)的約束條件
9@Digits數(shù)字位數(shù)的約束條件
10@DecimalMax最大數(shù)字的約束條件
11@DecimalMin最小數(shù)字的約束條件
12@Min最小的約束條件
13@Max最大的約束條件
13@NotBlank不能為空格的約束條件
14@NotEmpty不能為空的約束條件
15@Length長(zhǎng)度的約束條件
16@CNPJCNPJ 約束條件
17@CPFCPF 約束條件
18@URLURL 約束條件
18@EmailEmail 約束條件
19@UniqueElements元素唯一約束條件
20@Range指定范圍元素約束條件

條件注解

說(shuō)明

有時(shí)候我們需要根據(jù)不同的參數(shù),進(jìn)行不同的限制條件。

比如新建時(shí)用戶 id 不需要傳入,但是修改時(shí) id 必填。

如果是傳統(tǒng)的 hibernate-validator 處理就會(huì)比較麻煩,此處引入條件注解。

內(nèi)置注解

序號(hào)注解說(shuō)明
1@EqualsCondition等于指定值的條件
2@NotEqualsCondition不等于指定值的條件
3@AlwaysTrueCondition永遠(yuǎn)生效的條件
4@AlwaysFalseCondition永遠(yuǎn)不生效的條件

使用

使用起來(lái)也不難,下面的效果如下:

  • operType == 'create' 時(shí),name 的校驗(yàn)才會(huì)生效。
  • operType != 'create' 時(shí),id 的校驗(yàn)才會(huì)生效。

其他使用方式保持不變。

public class ConditionUser {
    /**
     * 操作類(lèi)型
     */
    @Ranges({"create", "edit"})
    private String operType;
    /**
     * 新建時(shí),name 必填
     */
    @EqualsCondition(value = "create", fieldName = "operType")
    @Size(min = 3)
    @NotNull
    private String name;
    /**
     * 不是新建時(shí), id 字段必填
     */
    @NotEqualsCondition(value = "create", fieldName = "operType")
    @Size(min = 16)
    private String id;
    //getter &amp; setter
}

過(guò)程式接口

說(shuō)明

日常開(kāi)發(fā)中,我們都很喜歡使用注解對(duì) java bean 進(jìn)行校驗(yàn)。

但是這回導(dǎo)致我們定義的單個(gè)屬性校驗(yàn)無(wú)法復(fù)用。

所以項(xiàng)目中的單個(gè)屬性校驗(yàn)和注解是一一對(duì)應(yīng)的,為了便于復(fù)用。

ValidHelper 方法

ValidHelper 作為統(tǒng)一封裝的工具類(lèi),提供單個(gè)方法校驗(yàn)常見(jiàn)的方法。

和 java bean 類(lèi)似,方法列表:

序號(hào)方法返回值說(shuō)明
1failOver(Object object, IConstraint constraint)IResult全部驗(yàn)證后返回
2failFast(Object object, IConstraint constraint)IResult快速驗(yàn)證后返回
3failOverThrow(Object object, IConstraint constraint)void全部驗(yàn)證后返回-未通過(guò)拋出 ValidRuntimeException 異常
4failFastThrow(Object object, IConstraint constraint)void快速驗(yàn)證后返回-未通過(guò)拋出 ValidRuntimeException 異常

使用例子

用法和 bean 的類(lèi)似,只是入?yún)⒍嗔说诙€(gè)約束條件。

IResult result = ValidHelper.failFast("", Constraints.notEmptyConstraint());

IConstraint 對(duì)應(yīng)關(guān)系

注解和常見(jiàn)的接口方法一一對(duì)應(yīng),所有的約束方法在 Constraints 工具類(lèi)中。

序號(hào)注解說(shuō)明對(duì)應(yīng)方法
1@AssertTrue為 true 約束條件assertTrueConstraint
2@AssertFalse為 false 約束條件assertFalseConstraint
3@Null為 null 約束條件nullConstraint
4@NotNull不為 null 約束條件notNullConstraint
5@Past是否在當(dāng)前時(shí)間之前約束條件pastConstraint
6@Future是否在當(dāng)前時(shí)間之后約束條件futureConstraint
7@Pattern正則表達(dá)式約束條件patternConstraint
8@Size在指定范圍內(nèi)的約束條件sizeConstraint
9@Digits數(shù)字位數(shù)的約束條件digitsConstraint
10@DecimalMax最大數(shù)字的約束條件decimalMaxConstraint
11@DecimalMin最小數(shù)字的約束條件decimalMinConstraint
12@Min最小的約束條件minConstraint
13@Max最大的約束條件maxConstraint
13@NotBlank不能為空格的約束條件notBlankConstraint
14@NotEmpty不能為空的約束條件notEmptyConstraint
15@Length長(zhǎng)度的約束條件lengthConstraint
16@CNPJCNPJ 約束條件cnpjConstraint
17@CPFCPF 約束條件cpfConstraint
18@URLURL 約束條件urlConstraint
18@EmailEmail 約束條件emailConstraint
19@UniqueElements元素唯一約束條件uniqueElementsConstraint
20@Range指定范圍元素約束條件rangeConstraint
21@AllEquals當(dāng)前字段及其指定的字段 全部相等allEqualsConstraint
22@EnumRanges當(dāng)前字段必須在枚舉值指定的范圍內(nèi)enumRangesConstraint
23@HasNotNull當(dāng)前字段及其指定的字段 至少有一個(gè)不為 nullhasNotNullConstraint
24@Ranges當(dāng)前字段必須在指定的范圍內(nèi)rangesConstraint

條件注解

注解和常見(jiàn)的接口方法一一對(duì)應(yīng),所有的約束方法在 Conditions 工具類(lèi)中。

序號(hào)注解說(shuō)明對(duì)應(yīng)方法
1@EqualsCondition等于指定值的條件equalsCondition
2@NotEqualsCondition不等于指定值的條件notEqualsCondition
3@AlwaysTrueCondition永遠(yuǎn)生效的條件alwaysTrueCondition
4@AlwaysFalseCondition永遠(yuǎn)不生效的條件alwaysFalseCondition

注解自定義

說(shuō)明

內(nèi)置的注解,自然無(wú)法滿足所有的場(chǎng)景。

本項(xiàng)目中,約束和條件注解都是支持自定義的。

約束注解 @Constraint

所有系統(tǒng)的內(nèi)置注解都可以作為學(xué)習(xí)的例子。

定義注解

以 @AllEquals 為例,核心的部分在 @Constraint(AtAllEqualsConstraint.class)。

我們?cè)?AtAllEqualsConstraint 中實(shí)現(xiàn)具體的約束邏輯。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(AtAllEqualsConstraint.class)
public @interface AllEquals {
    /**
     * 當(dāng)前字段及其指定的字段 全部相等
     * 1. 字段類(lèi)型及其他字段相同
     * @return 指定的字段列表
     */
    String[] value();
    /**
     * 提示消息
     * @return 錯(cuò)誤提示
     */
    String message() default "";
    /**
     * 分組信息
     * @return 分組類(lèi)
     * @since 0.1.2
     */
    Class[] group() default {};
}

實(shí)現(xiàn)邏輯

推薦直接繼承 AbstractAnnotationConstraint<A>,實(shí)現(xiàn)對(duì)應(yīng)的邏輯即可。

public class AtAllEqualsConstraint extends AbstractAnnotationConstraint&lt;AllEquals&gt; {
    @Override
    protected IConstraint buildConstraint(AllEquals annotation) {
        return Constraints.allEqualsConstraint(annotation.value());
    }
}

條件注解 @Condition

所有系統(tǒng)的內(nèi)置注解都可以作為學(xué)習(xí)的例子。

定義注解

以 @AlwaysTrueCondition 為例,核心的部分在 @Condition(AtAlwaysTrueCondition.class)。

我們?cè)?AtAlwaysTrueCondition 中實(shí)現(xiàn)具體的約束邏輯。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Condition(AtAlwaysTrueCondition.class)
public @interface AlwaysTrueCondition {
}

實(shí)現(xiàn)邏輯

推薦直接繼承 AbstractAnnotationCondition<A>,實(shí)現(xiàn)對(duì)應(yīng)的邏輯即可。

public class AtAlwaysTrueCondition extends AbstractAnnotationCondition<AlwaysTrueCondition> {
    @Override
    protected ICondition buildCondition(AlwaysTrueCondition annotation) {
        return Conditions.alwaysTrueCondition();
    }
}

開(kāi)源地址

為了便于大家學(xué)習(xí)使用,目前校驗(yàn)框架已開(kāi)源。

歡迎大家 fork+star,鼓勵(lì)一下老馬~

validator

以上就是hibernate-validator改進(jìn)校驗(yàn)框架validator v0.4使用的詳細(xì)內(nèi)容,更多關(guān)于validator校驗(yàn)框架的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解SpringCloud使用Consul做注冊(cè)中心

    詳解SpringCloud使用Consul做注冊(cè)中心

    這篇文章主要介紹了SpringCloud使用Consul做注冊(cè)中心,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java中的鎖分類(lèi)的詳細(xì)介紹

    Java中的鎖分類(lèi)的詳細(xì)介紹

    這篇文章主要介紹了Java中的鎖分類(lèi)的詳細(xì)介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 詳解Spring Boot下使用logback 記錄多個(gè)文件日志

    詳解Spring Boot下使用logback 記錄多個(gè)文件日志

    這篇文章主要介紹了詳解Spring Boot下使用logback 記錄多個(gè)文件日志,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • java web項(xiàng)目里ehcache.xml介紹

    java web項(xiàng)目里ehcache.xml介紹

    java web項(xiàng)目里ehcache.xml介紹,需要的朋友可以參考一下
    2013-03-03
  • mybatis時(shí)間范圍查詢代碼示例

    mybatis時(shí)間范圍查詢代碼示例

    這篇文章主要給大家介紹了關(guān)于mybatis時(shí)間范圍查詢的相關(guān)資料,在項(xiàng)?中避免不了要?到時(shí)間范圍查詢,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • SpringCloud中使用Sentinel實(shí)現(xiàn)限流的實(shí)戰(zhàn)

    SpringCloud中使用Sentinel實(shí)現(xiàn)限流的實(shí)戰(zhàn)

    限流在很多地方都可以使用的到,本篇博客將介紹如何使用SpringCloud中使用Sentinel實(shí)現(xiàn)限流,從而達(dá)到服務(wù)降級(jí)的目的,感興趣的可以了解一下
    2022-01-01
  • 一文搞懂MyBatis一級(jí)緩存和二級(jí)緩存

    一文搞懂MyBatis一級(jí)緩存和二級(jí)緩存

    本文主要介紹了一文搞懂MyBatis一級(jí)緩存和二級(jí)緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SpringBoot是如何實(shí)現(xiàn)自動(dòng)配置的你知道嗎

    SpringBoot是如何實(shí)現(xiàn)自動(dòng)配置的你知道嗎

    這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-08-08
  • Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決

    Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決

    這篇文章主要介紹了Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Tomcat數(shù)據(jù)源配置方法_JBuilder中

    Tomcat數(shù)據(jù)源配置方法_JBuilder中

    今天幫一同事配置一個(gè)數(shù)據(jù)源,采用tomcat5.5.9,本來(lái)是個(gè)很簡(jiǎn)單的事,以前也配過(guò),但由于很長(zhǎng)時(shí)間沒(méi)用過(guò)容器提供的數(shù)據(jù)源了(IOC用慣了),也只記的個(gè)大概了,所以剛開(kāi)始一配就出錯(cuò)了,google了一下,有很多資料,照著試試卻都不好使(到不是別人說(shuō)的不對(duì),只是大家用的版本不同)。
    2008-10-10

最新評(píng)論