今天就跟大家聊聊有關(guān)如何進行數(shù)據(jù)校驗Java Bean Validation 2.0,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站是專業(yè)的林州網(wǎng)站建設(shè)公司,林州接單;提供成都網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行林州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
我們知道通常情況下程序肯定是分層的,不同的層一般由不同的人來開發(fā)。若你是一個有經(jīng)驗的程序員, 我相信你肯定見過在不同的層了都出現(xiàn)了相同的校驗代碼,這就是某種意義上的垃圾代碼。 為了解決這個問題,Bean Validation
為 JavaBean
驗證定義了相應(yīng)的元數(shù)據(jù)模型和 API。默認的元數(shù)據(jù)是各種Java Annotations
,當(dāng)然也支持xml方式并且你也可以擴展~可以說Bean Validation
是JavaBean
的一個拓展,它可以布局于任意一層代碼,不局限于Web應(yīng)用還是端應(yīng)用。
Java Bean Validation
JSR是Java Specification Requests
的縮寫,意思是Java 規(guī)范提案。關(guān)于數(shù)據(jù)校驗這塊,最新的是JSR380
,就是JSR第380號標準。Bean Validation
是一個通過配置注解來驗證參數(shù)的框架,它包含兩部分Bean Validation API
(規(guī)范)和Hibernate Validator
(實現(xiàn))。
對Java的最低版本要求是Java 8
支持容器的校驗,通過TYPE_USE類型的注解實現(xiàn)對容器內(nèi)容的約束:`List<@Email String>`
支持日期/時間的校驗,@Past
和@Future
拓展元數(shù)據(jù)(新增注解):@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent
像@Email、@NotEmpty、@NotBlank
之前是Hibernate額外提供的,2.0標準后hibernate自動退位讓賢并且標注為過期了
Bean Validation 2.0
的唯一實現(xiàn)為Hibernate Validator
。(其實還有Apache BVal
,但是你懂的,forget it)
對于Hibernate Validator
,它自己也擴展了一些注解支持。
所以,對于Java Bean Validation
的實現(xiàn)落地產(chǎn)品就沒啥好選的,導(dǎo)入Hibernate Validator
(最新版本)吧:
POM加入
org.projectlombok lombok 1.16.20 org.hibernate hibernate-validator 6.0.17.Final org.apache.tomcat.embed tomcat-embed-el 8.5.29
編寫一個Java Bean
@Getter @Setter @ToString public class Person { // 錯誤消息message是可以自定義的 @NotNull(message = "名字不能為null") public String name; @Positive public Integer age; @NotNull @NotEmpty private List<@Email String> emails; @Future private Date start; }
public static void main(String[] args) { Person person = new Person(); //person.setName("fsx"); person.setAge(-1); // email校驗:雖然是List都可以校驗哦 person.setEmails(Arrays.asList("fsx@gmail.com", "baidu@baidu.com", "aaa.com")); //person.setStart(new Date()); //start 需要是一個將來的時間: Sun Jul 21 10:45:03 CST 2019 //person.setStart(new Date(System.currentTimeMillis() + 10000)); //校驗通過 // 對person進行校驗然后拿到結(jié)果(顯然使用時默認的校驗器) 會保留下校驗失敗的消息 Set> result = Validation.buildDefaultValidatorFactory().getValidator().validate(person); // 對結(jié)果進行遍歷輸出 result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()) .forEach(System.out::println); //用hibernateValidator HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class) .configure() .failFast(false); ValidatorFactory validatorFactory = configuration.buildValidatorFactory(); Set > sets= validatorFactory.getValidator().validate(person); sets.stream().map(v->v.getPropertyPath()+" " +v.getMessage()+":"+v.getInvalidValue()).forEach(System.out::println); }
運行mian函數(shù),控制臺打印輸出
name名字不能為null: null // 此處錯誤消息是自己的自定義內(nèi)容 age必須是正數(shù): -1 emails[2].不是一個合法的電子郵件地址: aaa.com
常見的驗證規(guī)則如下:
@AssertFalse 驗證boolean類型只能為false
@AssertTrue 驗證boolean類型只能為true
其它一些規(guī)則詳見:
javax.validation.constraints包下
官方給它的定義為:This class is the entry point for Bean Validation.
它作為校驗的入口,有三種方式來啟動,這里主要看最常見的啟動方式:
最簡單方式:使用默認的ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
可以直接提供一個類型安全的ValidationProvider
實現(xiàn)。比如HibernateValidator
就是一個ValidationProvider
的實現(xiàn):
HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class) // .providerResolver( ... ) // 因為制定了Provider,這個參數(shù)就可選了 .configure() .failFast(false); ValidatorFactory validatorFactory = configuration.buildValidatorFactory();
看完上述內(nèi)容,你們對如何進行數(shù)據(jù)校驗Java Bean Validation 2.0有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。