如何進(jìn)行數(shù)據(jù)校驗(yàn)JavaBeanValidation2.0

今天就跟大家聊聊有關(guān)如何進(jìn)行數(shù)據(jù)校驗(yàn)Java Bean Validation 2.0,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站是專業(yè)的林州網(wǎng)站建設(shè)公司,林州接單;提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行林州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

     我們知道通常情況下程序肯定是分層的,不同的層一般由不同的人來開發(fā)。若你是一個(gè)有經(jīng)驗(yàn)的程序員, 我相信你肯定見過在不同的層了都出現(xiàn)了相同的校驗(yàn)代碼,這就是某種意義上的垃圾代碼。 為了解決這個(gè)問題,Bean Validation 為 JavaBean 驗(yàn)證定義了相應(yīng)的元數(shù)據(jù)模型和 API。默認(rèn)的元數(shù)據(jù)是各種Java Annotations,當(dāng)然也支持xml方式并且你也可以擴(kuò)展~可以說Bean ValidationJavaBean的一個(gè)拓展,它可以布局于任意一層代碼,不局限于Web應(yīng)用還是端應(yīng)用。

Java Bean Validation

    JSR是Java Specification Requests的縮寫,意思是Java 規(guī)范提案。關(guān)于數(shù)據(jù)校驗(yàn)這塊,最新的是JSR380,就是JSR第380號(hào)標(biāo)準(zhǔn)。Bean Validation是一個(gè)通過配置注解來驗(yàn)證參數(shù)的框架,它包含兩部分Bean Validation API(規(guī)范)和Hibernate Validator(實(shí)現(xiàn))。

簡單Demo示例
  1. 對(duì)Java的最低版本要求是Java 8

  2. 支持容器的校驗(yàn),通過TYPE_USE類型的注解實(shí)現(xiàn)對(duì)容器內(nèi)容的約束:`List<@Email String>`

  3. 支持日期/時(shí)間的校驗(yàn),@Past@Future

  4. 拓展元數(shù)據(jù)(新增注解):@Email,@NotEmpty,@NotBlank,@Positive, @PositiveOrZero,@Negative,@NegativeOrZero,@PastOrPresent和@FutureOrPresent

    1. @Email、@NotEmpty、@NotBlank之前是Hibernate額外提供的,2.0標(biāo)準(zhǔn)后hibernate自動(dòng)退位讓賢并且標(biāo)注為過期了

  5. Bean Validation 2.0的唯一實(shí)現(xiàn)為Hibernate Validator。(其實(shí)還有Apache BVal,但是你懂的,forget it)

  6. 對(duì)于Hibernate Validator,它自己也擴(kuò)展了一些注解支持。

所以,對(duì)于Java Bean Validation的實(shí)現(xiàn)落地產(chǎn)品就沒啥好選的,導(dǎo)入Hibernate Validator(最新版本)吧:

  • POM加入

       <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.17.Final</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
            <version>8.5.29</version>
            <!--<scope>provided</scope> 打包時(shí)最用此scope-->
        </dependency>
  • 編寫一個(gè)Java Bean

@Getter
@Setter
@ToString
public class Person {

    // 錯(cuò)誤消息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校驗(yàn):雖然是List都可以校驗(yàn)哦
        person.setEmails(Arrays.asList("fsx@gmail.com", "baidu@baidu.com", "aaa.com"));
        //person.setStart(new Date()); //start 需要是一個(gè)將來的時(shí)間: Sun Jul 21 10:45:03 CST 2019
        //person.setStart(new Date(System.currentTimeMillis() + 10000)); //校驗(yàn)通過

        // 對(duì)person進(jìn)行校驗(yàn)然后拿到結(jié)果(顯然使用時(shí)默認(rèn)的校驗(yàn)器)   會(huì)保留下校驗(yàn)失敗的消息
        Set<ConstraintViolation<Person>> result = Validation.buildDefaultValidatorFactory().getValidator().validate(person);
        // 對(duì)結(jié)果進(jìn)行遍歷輸出
        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<ConstraintViolation<TestBean>> sets= validatorFactory.getValidator().validate(person);

		 sets.stream().map(v->v.getPropertyPath()+" " +v.getMessage()+":"+v.getInvalidValue()).forEach(System.out::println);
    }
  • 運(yùn)行mian函數(shù),控制臺(tái)打印輸出

name名字不能為null: null //  此處錯(cuò)誤消息是自己的自定義內(nèi)容
age必須是正數(shù): -1
emails[2].<list element>不是一個(gè)合法的電子郵件地址: aaa.com

常見的驗(yàn)證規(guī)則如下:

@AssertFalse   驗(yàn)證boolean類型只能為false
@AssertTrue   驗(yàn)證boolean類型只能為true

其它一些規(guī)則詳見:

javax.validation.constraints包下

核心API分析

Validation類

    官方給它的定義為:This class is the entry point for Bean Validation.它作為校驗(yàn)的入口,有三種方式來啟動(dòng),這里主要看最常見的啟動(dòng)方式:

  • 最簡單方式:使用默認(rèn)的ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); 

  • 可以直接提供一個(gè)類型安全ValidationProvider實(shí)現(xiàn)。比如HibernateValidator就是一個(gè)ValidationProvider的實(shí)現(xiàn):

    HibernateValidatorConfiguration configuration = Validation.byProvider(HibernateValidator.class)
            // .providerResolver( ... ) // 因?yàn)橹贫薖rovider,這個(gè)參數(shù)就可選了
            .configure()
            .failFast(false);
    ValidatorFactory validatorFactory = configuration.buildValidatorFactory();

     

看完上述內(nèi)容,你們對(duì)如何進(jìn)行數(shù)據(jù)校驗(yàn)Java Bean Validation 2.0有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前文章:如何進(jìn)行數(shù)據(jù)校驗(yàn)JavaBeanValidation2.0
文章轉(zhuǎn)載:http://bm7419.com/article18/jccjgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)服務(wù)器托管、網(wǎng)站維護(hù)、Google、網(wǎng)站策劃、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化