Hibernate Validator實(shí)現(xiàn)更簡(jiǎn)潔的參數(shù)校驗(yàn)及一個(gè)util
代碼地址
https://github.com/wheel-organization/wheel
簡(jiǎn)介
hibernate-validator是Hibernate項(xiàng)目中的一個(gè)數(shù)據(jù)校驗(yàn)框架,是Bean Validation 的參考實(shí)現(xiàn),hibernate-validator除了提供了JSR 303規(guī)范中所有內(nèi)置constraint 的實(shí)現(xiàn),還有一些附加的constraint。
使用hibernate-validator能夠?qū)?shù)據(jù)校驗(yàn)從業(yè)務(wù)代碼中脫離出來(lái),增加代碼可讀性,同時(shí)也讓數(shù)據(jù)校驗(yàn)變得更加方便、簡(jiǎn)單。
官網(wǎng)地址:http://hibernate.org/validator/
如何使用
項(xiàng)目中已經(jīng)引入了需要的api,無(wú)需重復(fù)引入
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> </dependency>
在要校驗(yàn)的POJO上加上以下注解即可
| 注解 | 用途 |
|---|---|
| Valid | 遞歸的對(duì)關(guān)聯(lián)的對(duì)象進(jìn)行校驗(yàn) |
| AssertFalse | 用于boolean字段,該字段的值只能為false |
| AssertTrue | 用于boolean字段,該字段只能為true |
| DecimalMax(value) | 被注釋的元素必須是一個(gè)數(shù)字,只能大于或等于該值 |
| DecimalMin(value) | 被注釋的元素必須是一個(gè)數(shù)字,只能小于或等于該值 |
| Digits(integer,fraction) | 檢查是否是一種數(shù)字的(整數(shù),小數(shù))的位數(shù) |
| Future | 檢查該字段的日期是否是屬于將來(lái)的日期 |
| FutureOrPresent | 判斷日期是否是將來(lái)或現(xiàn)在日期 |
| Past | 檢查該字段的日期是在過(guò)去 |
| PastOrPresent | 判斷日期是否是過(guò)去或現(xiàn)在日期 |
| Max(value) | 該字段的值只能小于或等于該值 |
| Min(value) | 該字段的值只能大于或等于該值 |
| Negative | 判斷負(fù)數(shù) |
| NegativeOrZero | 判斷負(fù)數(shù)或0 |
| Positive | 判斷正數(shù) |
| PositiveOrZero | 判斷正數(shù)或0 |
| NotNull | 不能為null |
| Null | 必須為 null |
| Pattern(value) | 被注釋的元素必須符合指定的正則表達(dá)式 |
| Size(max, min) | 檢查該字段的size是否在min和max之間,可以是字符串、數(shù)組、集合、Map等 |
| Length(max, min) | 判斷字符串長(zhǎng)度 |
| CreditCardNumber | 被注釋的字符串必須通過(guò)Luhn校驗(yàn)算法,銀行卡,信用卡等號(hào)碼一般都用Luhn計(jì)算合法性 |
| 被注釋的元素必須是電子郵箱地址 | |
| Length(min=, max=) | 被注釋的字符串的大小必須在指定的范圍內(nèi) |
| NotBlank | 只能用于字符串不為null,并且字符串trim()以后length要大于0 |
| NotEmpty | 集合對(duì)象的元素不為0,即集合不為空,也可以用于字符串不為null |
| Range(min=, max=) | 被注釋的元素必須在合適的范圍內(nèi) |
| SafeHtml | classpath中要有jsoup包 |
| ScriptAssert | 要有Java Scripting API 即JSR 223("Scripting for the JavaTMPlatform")的實(shí)現(xiàn) |
| URL(protocol=,host=,port=,regexp=,flags=) | 被注釋的字符串必須是一個(gè)有效的url |
更多功能,如:自定義校驗(yàn)規(guī)則、分組校驗(yàn)、關(guān)聯(lián)參數(shù)聯(lián)合校驗(yàn)請(qǐng)查看官網(wǎng)或百度
Dubbo中使用Hibernate Validator校驗(yàn)入?yún)?/strong>
無(wú)需util,Dubbo接口配置上的validation為true即可
在客戶端驗(yàn)證參數(shù)
<dubbo:reference id="xxxService" interface="xxx.ValidationService" validation="true" />
在服務(wù)器端驗(yàn)證參數(shù)
<dubbo:service interface="xxx.ValidationService" ref="xxxService" validation="true" />
在代碼里校驗(yàn)入?yún)?br />
//obj為包含Hibernate Validator注解的POJO //快速失敗模式 ValidResult validResult = ValidationUtil.fastFailValidate(obj); //obj為包含Hibernate Validator注解的POJO //全部校驗(yàn)?zāi)J? 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;
}
單測(cè):ValidationUtilTest
性能測(cè)試
結(jié)果如圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springBoot基于webSocket實(shí)現(xiàn)掃碼登錄
最近做了個(gè)新項(xiàng)目,涉及到掃碼登錄。之前項(xiàng)目使用的是 ajax輪詢的方式。感覺(jué)太low了。所以這次用webSocket的方式進(jìn)行實(shí)現(xiàn),感興趣的可以了解一下2021-06-06
JAVA JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解
這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-09-09
springboot接收json數(shù)據(jù)時(shí),接收到空值問(wèn)題
這篇文章主要介紹了springboot接收json數(shù)據(jù)時(shí),接收到空值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
mybatis查詢結(jié)果返回至實(shí)體類的示例代碼
這篇文章主要介紹了mybatis查詢結(jié)果返回至實(shí)體類的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
jfinal中stateless模式嵌入shiro驗(yàn)證的實(shí)現(xiàn)方式
這篇文章主要介紹了jfinal中stateless模式嵌入shiro驗(yàn)證,今天,我們就來(lái)嘗試一種通過(guò)攔截器來(lái)實(shí)現(xiàn)的Stateless Jfinal嵌入方式,需要的朋友可以參考下2022-06-06

