Java?Bean?Validation使用示例詳解
引言
使用標(biāo)準(zhǔn)框架驗(yàn)證Java bean的基礎(chǔ)知識 - JSR 380,也稱為Bean Validation 2.0。
當(dāng)然,驗(yàn)證用戶輸入在大多數(shù)應(yīng)用程序中是一個(gè)超常見的要求,Java Bean Validation框架已經(jīng)成為處理這種邏輯的事實(shí)上的標(biāo)準(zhǔn)。
JSR 380
JSR 380是用于bean驗(yàn)證的Java API的規(guī)范,是JavaEE和JavaSE的一部分,它使用@NotNull、@Min和@Max等注釋確保bean的屬性滿足特定的標(biāo)準(zhǔn)。
此版本需要Java 8或更高版本,并利用Java 8中添加的新功能(如類型注釋),并支持Optional和LocalDate等新類型。
有關(guān)規(guī)范的完整信息,請繼續(xù)閱讀JSR 380。
依賴性
我們將使用Maven示例來顯示所需的依賴項(xiàng),但當(dāng)然,可以使用各種方式添加這些jar。
驗(yàn)證API
根據(jù)JSR 380規(guī)范,validation-api依賴包含標(biāo)準(zhǔn)驗(yàn)證API:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.0.Final</version> </dependency>
驗(yàn)證API參考實(shí)現(xiàn)
Hibernate Validator是驗(yàn)證API的參考實(shí)現(xiàn)。
要使用它,我們必須添加以下依賴項(xiàng):
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.2.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>6.0.2.Final</version> </dependency>
這里快速說明的是,hibernate-validator完全獨(dú)立于Hibernate的持久性方面,并且通過將其添加為依賴項(xiàng),我們不會將這些持久性方面添加到項(xiàng)目中。
表達(dá)式語言依賴關(guān)系
JSR 380提供對變量插值的支持,允許在違規(guī)消息中使用表達(dá)式。
要解析這些表達(dá)式,我們必須在表達(dá)式語言API和該API的實(shí)現(xiàn)上添加依賴項(xiàng)。GlassFish提供參考實(shí)現(xiàn):
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.6</version> </dependency>
如果未添加這些JAR,您將在運(yùn)行時(shí)收到錯(cuò)誤消息,如下所示:
HV000183:無法加載'javax.el.E??xpressionFactory'。檢查您是否在類路徑上有EL依賴項(xiàng),或使用ParameterMessageInterpolator
使用注解驗(yàn)證
我們將在這里使用User bean作為主要示例,并為其添加一些簡單的驗(yàn)證:
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 }
示例中使用的所有注釋都是標(biāo)準(zhǔn)的JSR注釋:
- @NotNull - 驗(yàn)證帶注釋的屬性值不為 null
- @AssertTrue - 驗(yàn)證帶注釋的屬性值是否為 true
- @Size - 驗(yàn)證帶注釋的屬性值是否具有屬性min和max之間的大小; 可以應(yīng)用于String, Collection, Map和數(shù)組屬性
- @Min - 驗(yàn)證帶注釋的屬性的值是否小于value屬性
- @Max - 驗(yàn)證帶注釋的屬性的值是否大于value屬性
- @Email - 驗(yàn)證帶注釋的屬性是否為有效的電子郵件地址
某些注釋接受其他屬性,但message屬性對所有屬性都是通用的。這是當(dāng)相應(yīng)屬性的值未通過驗(yàn)證時(shí)通常會呈現(xiàn)的消息。
可以在JSR中找到的一些其他注釋是:
- @NotEmpty - 驗(yàn)證屬性不為null或?yàn)榭? 可以應(yīng)用于String, Collection, Map或 Array值
- @NotBlank - 只能應(yīng)用于文本值,并驗(yàn)證該屬性不是null或空格
- @Positive和@PositiveOrZero - 適用于數(shù)值并驗(yàn)證它們是嚴(yán)格正數(shù)還是正數(shù),包括0
- @Negative和@NegativeOrZero - 適用于數(shù)值并驗(yàn)證它們是嚴(yán)格為負(fù)數(shù),還是負(fù)數(shù),包括0
- @Past和@PastOrPresent - 驗(yàn)證日期值是否過去,包括現(xiàn)在; 可以應(yīng)用于日期類型,包括Java 8中添加的日期類型
- @Future和@FutureOrPresent - 驗(yàn)證日期值是否將來包括現(xiàn)在
驗(yàn)證注釋也可以應(yīng)用于集合的元素:
List<@NotBlank String> preferences;
在這種情況下,將驗(yàn)證添加到選項(xiàng)列表中的任何值。
該規(guī)范還支持 Java 8中的新Optional類型:
private LocalDate dateOfBirth; public Optional<@Past LocalDate> getDateOfBirth() { return Optional.of(dateOfBirth); }
在這里,驗(yàn)證框架將自動解包LocalDate值并對其進(jìn)行驗(yàn)證。
程序驗(yàn)證
一些框架 - 例如Spring--只需使用注釋就可以通過簡單的方法觸發(fā)驗(yàn)證過程。這主要是為了使我們不必與程序驗(yàn)證API進(jìn)行交互。
現(xiàn)在讓我們進(jìn)入手動路線并以編程方式設(shè)置:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator();
要驗(yàn)證bean,我們必須首先擁有Validator對象,該對象使用ValidatorFactory構(gòu)造。
定義Bean
我們現(xiàn)在要設(shè)置一個(gè)無效用戶 - 使用空名稱值:
User user = new User(); user.setWorking(true); user.setAboutMe("Its all about me!"); user.setAge(50);
驗(yàn)證Bean
現(xiàn)在我們有了一個(gè)Validator,我們可以通過將它傳遞給validate方法來驗(yàn)證我們的bean 。任何違反User對象中定義的約束的行為都將作為Set返回。
Set<ConstraintViolation<User>> violations = validator.validate(user);
通過迭代違規(guī),我們可以使用getMessage方法獲取所有違規(guī)消息。
for (ConstraintViolation<User> violation : violations) { log.error(violation.getMessage()); }
在我們的示例中(ifNameIsNull_nameValidationFails),該集合將包含一個(gè)ConstraintViolation,消息“ Name not not null”。
以上就是Java Bean Validation使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java Bean Validation的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)
這篇文章主要介紹了Java中jqGrid 學(xué)習(xí)筆記整理——進(jìn)階篇(二)的相關(guān)資料,需要的朋友可以參考下2016-04-04SpringBoot使用ip2region獲取地理位置信息的方法
這篇文章主要介紹了SpringBoot使用ip2region獲取地理位置信息的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java?axios與spring前后端分離傳參規(guī)范總結(jié)
這篇文章主要介紹了Java?axios與spring前后端分離傳參規(guī)范總結(jié),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08