首頁 > Java > java教程 > Java中有關validation後台參數驗證的使用詳解

Java中有關validation後台參數驗證的使用詳解

黄舟
發布: 2017-10-20 09:47:32
原創
2350 人瀏覽過

本篇文章主要介紹了java validation 後台參數驗證的使用詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

一、前言

在後台開發過程中,對參數的校驗成為開發環境不可缺少的一個環節。例如參數不能為null,email那麼必須符合email的格式,如果手動進行if判斷或寫正規表示式判斷無意開發效率太慢,在時間、成本、品質的賽局必然會落後。所以把校驗層抽象化是必然的結果,下面說下幾個解決方案。

二、幾個解決方案

1、struts2的valid可以透過設定xml,xml中描述規則和傳回的訊息,這種方式比較麻煩、開發效率低,不推薦

2、validation bean 是基於JSR-303標準開發出來的,使用註解方式實現,及其方便,但是這只是一個接口,沒有具體實現. Hibernate Validator是一個hibernate獨立的包,可以直接引用,他實現了validation bean同時有做了擴展,比較強大,實現圖如下:

##點此查看中文官方手冊

3、oval 是一個可擴展的Java物件資料驗證框架,驗證的規則可以透過設定檔、Annotation、POJOs 進行設定。可以使用純Java 語言、JavaScript 、Groovy 、BeanShell 等進行規則的編寫,本次不過多講解

三、bean validation 框架驗證介紹

bean validation 套件放在maven上維護,最新套件的座標如下:


<dependency>

  <groupId>javax.validation</groupId>

  <artifactId>validation-api</artifactId>

  <version>1.1.0.Final</version>

</dependency>
登入後複製

 點擊這裡查看最新的座標地址

下載之後打開這個包,有個package叫constraints,裡面放的就是驗證的的註解:

#  

下面開始用程式碼實作一下:

#1、定義一個待驗證的bean:Student.java


package com.shishang;

import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

public class Student implements Serializable {


  @NotNull(message = "名字不能为空")
  private String name;

  @Size(min = 6,max = 30,message = "地址应该在6-30字符之间")
  private String address;

  @DecimalMax(value = "100.00",message = "体重有些超标哦")
  @DecimalMin(value = "60.00",message = "多吃点饭吧")
  private BigDecimal weight;

  private String friendName;
  @AssertTrue
  private Boolean isHaveFriend(){
    return friendName != null?true:false;
  }

  @Future(message = "生日必须在当前实践之前")
  private Date birthday;

  @Pattern(regexp = "^(.+)@(.+)$",message = "邮箱的格式不合法")
  private String email;


  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public BigDecimal getWeight() {
    return weight;
  }

  public void setWeight(BigDecimal weight) {
    this.weight = weight;
  }

  public String getFriendName() {
    return friendName;
  }

  public void setFriendName(String friendName) {
    this.friendName = friendName;
  }

  public Date getBirthday() {
    return birthday;
  }

  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }
}
登入後複製

2、測試類別:StudentTest.java



package com.use;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

public class StudentTest implements Serializable {
  public static void main(String[] args) {
    Student xiaoming = getBean();
    List<String> validate = validate(xiaoming);
    validate.forEach(row -> {
      System.out.println(row.toString());
    });

  }

  private static Student getBean() {
    Student bean = new Student();
    bean.setName(null);
    bean.setAddress("北京");
    bean.setBirthday(new Date());
    bean.setFriendName(null);
    bean.setWeight(new BigDecimal(30));
    bean.setEmail("xiaogangfan163.com");
    return bean;
  }

  private static ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

  public static <T> List<String> validate(T t) {
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<T>> constraintViolations = validator.validate(t);

    List<String> messageList = new ArrayList<>();
    for (ConstraintViolation<T> constraintViolation : constraintViolations) {
      messageList.add(constraintViolation.getMessage());
    }
    return messageList;
  }
}
登入後複製

3、執行testValidation()方法,輸處置如下:

  1. 位址應該在6-30字元之間

  2. 郵件信箱的格式不合法

  3. 生日必須在目前時間之前

  4. #多吃點飯吧

  5. ##名字不能為空
  6. 4、總結


    像@NotNull、@Size等比較簡單也容易理解,不多說
  1. 因為bean validation只提供了介面並未實現,使用時需要加上一個provider的包,例如hibernate-validator
  2. @Pattern 因為這個是正規,所以能做的事情比較多,例如中文還是數字、郵箱、長度等等都可以做
  3. #@AssertTRue 這個與其他的校驗註解有著本質的區別,這個註解適用於多個欄位。範例中isHaveFriend方法依賴friendName欄位校驗
  4. 驗證的api是經過我加工了一下,這樣可以批次傳回校驗的資訊
  5. 有時我們需要的註解可能沒有提供,這時候就需要自訂註解,寫實現類,下面說一下自訂註解的使用

四、自訂bean validation 註解驗證有時框架自帶的沒法滿足我們的需求,這時就需要自己動手豐衣足食了,恩恩,這個不難,下面說下。

這個範例驗證字串是大寫還是小寫約束標註,程式碼如下:

1、枚舉型別CaseMode, 來表示大寫或小寫模式

 package com.defineconstrain;

/**
 * created by xiaogangfan
 * on 16/10/25.
 */
public enum CaseMode {
  UPPER,
  LOWER;
}
登入後複製

2、定義一個CheckCase的約束標註


#

package com.defineconstrain;

/**
 * created by xiaogangfan
 * on 16/10/25.
 */
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = CheckCaseValidator.class)
@Documented
public @interface CheckCase {

  String message() default "{com.mycompany.constraints.checkcase}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  CaseMode value();

}
登入後複製

3、約束條件CheckCase的驗證器


#

package com.defineconstrain;

/**
 * created by xiaogangfan
 * on 16/10/25.
 */
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CheckCaseValidator implements ConstraintValidator<CheckCase, String> {

  private CaseMode caseMode;

  public void initialize(CheckCase constraintAnnotation) {
    this.caseMode = constraintAnnotation.value();
  }

  public boolean isValid(String object, ConstraintValidatorContext constraintContext) {

    if (object == null)
      return true;

    if (caseMode == CaseMode.UPPER)
      return object.equals(object.toUpperCase());
    else
      return object.equals(object.toLowerCase());
  }

}
登入後複製

4、在Student.java中增加一個屬性

#

@CheckCase(value = CaseMode.LOWER,message = "名字的拼音需要小写")
private String spellName;
登入後複製

5、在StudentTest.java的getBean()方法中增加一行

bean.setSpellName("XIAOGANGFAN");
登入後複製

6、執行testValidation()方法,輸如下:

    位址應該在6-30字元之間
  1. 郵箱的格式不合法
  2. 生日必須在當前時間之前
  3. 多吃點飯吧
  4. 名字的拼音需要小寫
  5. #名字不能為空

以上是Java中有關validation後台參數驗證的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板