摘要:表達式語言依賴關系提供對變量插值的支持,允許在違規消息中使用表達式。這是當相應屬性的值未通過驗證時通常會呈現的消息。任何違反對象中定義的約束的行為都將作為返回。案例結論本文重點介紹了標準的簡單傳遞,并使用注釋和說明了驗證的基礎知識。
案例概述
在這本文中,我們將介紹使用標準框架驗證Java bean的基礎知識 - JSR 380,也稱為Bean Validation 2.0。
當然,驗證用戶輸入在大多數應用程序中是一個超常見的要求,Java Bean Validation框架已經成為處理這種邏輯的事實上的標準。
JSR 380
JSR 380是用于bean驗證的Java API的規范,是JavaEE和JavaSE的一部分,它使用@NotNull、@Min和@Max等注釋確保bean的屬性滿足特定的標準。
此版本需要Java 8或更高版本,并利用Java 8中添加的新功能(如類型注釋),并支持Optional和LocalDate等新類型。
有關規范的完整信息,請繼續閱讀JSR 380。
依賴性
我們將使用Maven示例來顯示所需的依賴項,但當然,可以使用各種方式添加這些jar。
驗證API
根據JSR 380規范,validation-api依賴包含標準驗證API:
???? javax.validation ????validation-api ????2.0.0.Final
驗證API參考實現
Hibernate Validator是驗證API的參考實現。
要使用它,我們必須添加以下依賴項:
???? org.hibernate.validator ????hibernate-validator ????6.0.2.Final ???? org.hibernate.validator ????hibernate-validator-annotation-processor ????6.0.2.Final
這里快速說明的是,hibernate-validator完全獨立于Hibernate的持久性方面,并且通過將其添加為依賴項,我們不會將這些持久性方面添加到項目中。
表達式語言依賴關系
JSR 380提供對變量插值的支持,允許在違規消息中使用表達式。
要解析這些表達式,我們必須在表達式語言API和該API的實現上添加依賴項。GlassFish提供參考實現:
???? ?javax.el ????javax.el-api ????3.0.0 ???? org.glassfish.web ????javax.el ????2.2.6
如果未添加這些JAR,您將在運行時收到錯誤消息,如下所示:
HV000183:無法加載"javax.el.E??xpressionFactory"。檢查您是否在類路徑上有EL依賴項,或使用ParameterMessageInterpolator
使用驗證注釋
我們將在這里使用User bean作為主要示例,并為其添加一些簡單的驗證:
import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.constraints.Email; ? public class User { ? ????@NotNull(message = "Name cannot be null") ????private String name; ? ????@AssertTrue ????private boolean working; ? ????@Size(min = 10, max = 200, message ??????= "About Me must be between 10 and 200 characters") ????private String aboutMe; ? ????@Min(value = 18, message = "Age should not be less than 18") ????@Max(value = 150, message = "Age should not be greater than 150") ????private int age; ? ????@Email(message = "Email should be valid") ????private String email; ? ????// standard setters and getters }
示例中使用的所有注釋都是標準的JSR注釋:
@NotNull - 驗證帶注釋的屬性值不為 null
@AssertTrue - 驗證帶注釋的屬性值是否為 true
@Size - 驗證帶注釋的屬性值是否具有屬性min和max之間的大小; 可以應用于String, Collection, Map和數組屬性
@Min - 驗證帶注釋的屬性的值是否小于value屬性
@Max - 驗證帶注釋的屬性的值是否大于value屬性
@Email - 驗證帶注釋的屬性是否為有效的電子郵件地址
某些注釋接受其他屬性,但message屬性對所有屬性都是通用的。這是當相應屬性的值未通過驗證時通常會呈現的消息。
可以在JSR中找到的一些其他注釋是:
@NotEmpty - 驗證屬性不為null或為空; 可以應用于String, Collection, Map或 Array值
@NotBlank - 只能應用于文本值,并驗證該屬性不是null或空格
@Positive和@PositiveOrZero - 適用于數值并驗證它們是嚴格正數還是正數,包括0
@Negative和@NegativeOrZero - 適用于數值并驗證它們是嚴格為負數,還是負數,包括0
@Past和@PastOrPresent - 驗證日期值是否過去,包括現在; 可以應用于日期類型,包括Java 8中添加的日期類型
@Future和@FutureOrPresent - 驗證日期值是否將來包括現在
驗證注釋也可以應用于集合的元素:
List<@NotBlank String> preferences;
在這種情況下,將驗證添加到選項列表中的任何值。
該規范還支持 Java 8中的新Optional類型:
private LocalDate dateOfBirth; ? public Optional<@Past LocalDate> getDateOfBirth() { ????return Optional.of(dateOfBirth); }
在這里,驗證框架將自動解包LocalDate值并對其進行驗證。
程序驗證
一些框架 - 例如Spring--只需使用注釋就可以通過簡單的方法觸發驗證過程。這主要是為了使我們不必與程序驗證API進行交互。
現在讓我們進入手動路線并以編程方式設置:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator();
要驗證bean,我們必須首先擁有Validator對象,該對象使用ValidatorFactory構造。
定義Bean
我們現在要設置一個無效用戶 - 使用空名稱值:
User user = new User(); user.setWorking(true); user.setAboutMe("Its all about me!"); user.setAge(50);
驗證Bean
現在我們有了一個Validator,我們可以通過將它傳遞給validate方法來驗證我們的bean 。任何違反User對象中定義的約束的行為都將作為Set返回。
Set> violations = validator.validate(user);
通過迭代違規,我們可以使用getMessage方法獲取所有違規消息。
for (ConstraintViolationviolation : violations) { ????log.error(violation.getMessage()); }
在我們的示例中(ifNameIsNull_nameValidationFails),該集合將包含一個ConstraintViolation,消息“ Name not not null”。
案例結論
本文重點介紹了標準Java Validation API的簡單傳遞,并使用javax.validation注釋和API 說明了bean驗證的基礎知識。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73174.html
摘要:可能有人認為數據校驗模塊并不是那么的重要,因為硬編碼都可以做。我以數據綁定為引子引出了數據校驗這一塊,是想表明它的重要性。關于數據校驗這塊,最新的是,也就是我們常說的。 每篇一句 吾皇一日不退役,爾等都是臣子 對Spring感興趣可掃碼加入wx群:Java高工、架構師3群(文末有二維碼) 前言 前幾篇文章在講Spring的數據綁定的時候,多次提到過數據校驗??赡苡腥苏J為數據校驗模塊...
摘要:所以就有今天的話題利用注解對進行校驗。利用注解對進行校驗,主要是利用框架,實現了的接口關于校驗的接口,直接使用非常方便,省時省力。 最近寫業務代碼,因為頁面復雜,導致對應的Bean屬性非常多,而產品大佬又提出各種校驗要求。 emmmmmm......如果寫if條件來校驗,那簡直是又臭又長。 所以就有今天的話題——利用注解對Bean進行校驗。 利用注解對Bean進行校驗,主要是利用hib...
摘要:和上標注的約束都會被執行注意如果子類覆蓋了父類的方法,那么子類和父類的約束都會被校驗。 每篇一句 沒有任何技術方案會是一種銀彈,任何東西都是有利弊的 相關閱讀 【小家Java】深入了解數據校驗:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】Spring方法級別數據校...
摘要:就這樣借助相關約束注解,就非常簡單明了,語義清晰的優雅的完成了方法級別入參校驗返回值校驗的校驗。但倘若是返回值校驗執行了即使是失敗了,方法體也肯定被執行了只能哪些類型上提出這個細節的目的是約束注解并不是能用在所有類型上的。 每篇一句 在《深度工作》中作者提出這么一個公式:高質量產出=時間*專注度。所以高質量的產出不是靠時間熬出來的,而是效率為王 相關閱讀 【小家Java】深入了解數據校...
摘要:如果說要使用數據校驗,我十分相信小伙伴們都能夠使用,但估計大都是有個前提的環境。具體使用可參考小家讓支持對平鋪參數執行數據校驗默認使用只能對進行校驗級聯校驗什么叫級聯校驗,其實就是帶校驗的成員里存在級聯對象時,也要對它完成校驗。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術 相關閱讀 【小家Java】深入了解數據校驗:Java Bean Validation 2.0(...
閱讀 2348·2021-11-15 11:37
閱讀 2625·2021-09-23 11:21
閱讀 2952·2021-09-07 10:11
閱讀 3164·2019-08-30 15:53
閱讀 2826·2019-08-29 15:13
閱讀 1606·2019-08-26 13:57
閱讀 1098·2019-08-26 12:23
閱讀 2438·2019-08-26 11:51