Hibernate Validator—更簡潔的參數校驗及一個util

代碼地址

https://github.com/wheel-orga...

簡介

hibernate-validator是Hibernate項目中的一個數據校驗框架,是Bean Validation 的參考實現,hibernate-validator除了提供了JSR 303規範中全部內置constraint 的實現,還有一些附加的constraint。

使用hibernate-validator可以將數據校驗從業務代碼中脫離出來,增長代碼可讀性,同時也讓數據校驗變得更加方便、簡單。java

官網地址:http://hibernate.org/validator/git

如何使用

項目中已經引入了須要的api,無需重複引入
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.16.Final</version>
</dependency>

在要校驗的POJO上加上如下註解便可github

註解 用途
Valid 遞歸的對關聯的對象進行校驗
AssertFalse 用於boolean字段,該字段的值只能爲false
AssertTrue 用於boolean字段,該字段只能爲true
DecimalMax(value) 被註釋的元素必須是一個數字,只能大於或等於該值
DecimalMin(value) 被註釋的元素必須是一個數字,只能小於或等於該值
Digits(integer,fraction) 檢查是不是一種數字的(整數,小數)的位數
Future 檢查該字段的日期是不是屬於未來的日期
FutureOrPresent 判斷日期是不是未來或如今日期
Past 檢查該字段的日期是在過去
PastOrPresent 判斷日期是不是過去或如今日期
Max(value) 該字段的值只能小於或等於該值
Min(value) 該字段的值只能大於或等於該值
Negative 判斷負數
NegativeOrZero 判斷負數或0
Positive 判斷正數
PositiveOrZero 判斷正數或0
NotNull 不能爲null
Null 必須爲 null
Pattern(value) 被註釋的元素必須符合指定的正則表達式
Size(max, min) 檢查該字段的size是否在min和max之間,能夠是字符串、數組、集合、Map等
Length(max, min) 判斷字符串長度
CreditCardNumber 被註釋的字符串必須經過Luhn校驗算法,銀行卡,信用卡等號碼通常都用Luhn計算合法性
Email 被註釋的元素必須是電子郵箱地址
Length(min=, max=) 被註釋的字符串的大小必須在指定的範圍內
NotBlank 只能用於字符串不爲null,而且字符串trim()之後length要大於0
NotEmpty 集合對象的元素不爲0,即集合不爲空,也能夠用於字符串不爲null
Range(min=, max=) 被註釋的元素必須在合適的範圍內
SafeHtml classpath中要有jsoup包
ScriptAssert 要有Java Scripting API 即JSR 223("Scripting for the JavaTMPlatform")的實現
URL(protocol=,host=,port=,regexp=,flags=) 被註釋的字符串必須是一個有效的url

更多功能,如:自定義校驗規則、分組校驗、關聯參數聯合校驗請查看官網或百度正則表達式

Dubbo中使用Hibernate Validator校驗入參

無需util,Dubbo接口配置上的validation爲true便可算法

在客戶端驗證參數express

<dubbo:reference id="xxxService" interface="xxx.ValidationService" validation="true" />

在服務器端驗證參數api

<dubbo:service interface="xxx.ValidationService" ref="xxxService" validation="true" />

在代碼裏校驗入參

//obj爲包含Hibernate Validator註解的POJO
//快速失敗模式
ValidResult validResult = ValidationUtil.fastFailValidate(obj);
//obj爲包含Hibernate Validator註解的POJO
//所有校驗模式
ValidResult validResult = ValidationUtil.allCheckValidate(obj);

樣例

public class ParamTestDTO implements Serializable {

    private static final long serialVersionUID = 7123882542534668217L;

    @AssertTrue(message = "Error True")
    private Boolean testTrue;

    @AssertFalse(message = "Error False")
    private Boolean testFalse;

    @DecimalMax(value = "10", message = "Error StrMax")
    private String testStrMax;

    @DecimalMin(value = "1", message = "Error StrMin")
    private String testStrMin;

    @Max(value = 10, message = "Error Max")
    private Integer testMax;

    @Min(value = 1, message = "Error Min")
    private Double testMin;

    @Digits(integer = 2, fraction = 3, message = "Error Dig")
    private BigDecimal testDig;

    @Past(message = "Error Past")
    private Date testPast;

    @Future(message = "Error Future")
    private Date testFuture;

    @Null(message = "Error Null")
    private String testNull;

    @NotNull(message = "Error NonNull")
    private String testNonNull;

    @Pattern(regexp = "^[0-9]?[0-9]$", message = "Error Pattern")
    private String testPattern;

    @Size(min = 1, max = 10, message = "Error Size")
    private List<String> testSize;

    @Length(min = 1, max = 10, message = "Error Length")
    private String testLength;

    @NotBlank(message = "Error Blank")
    private String testBlank;

    @NotEmpty(message = "Error NotEmpty")
    private String testEmpty;

    @Range(min = 1, max = 10, message = "Error Range")
    private String testRange;
}

單測:ValidationUtilTest數組

性能測試

結果如圖:
服務器

可能遇到的bug

HV000183: Unable to initialize 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead

緣由:沒有引入javax.el或者javax.el版本衝突框架

解決:
沒有引入的話引入

<dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
            <version>3.0.1-b09</version>
        </dependency>

若是版本衝突的話先嚐試去除依賴,或者換個低版本的hibernate-validator

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
        </dependency>

參考解決

相關文章
相關標籤/搜索