mint-validate 輕量 驗證工具包

工具包的結構

本工具下載地址:http://git.oschina.net/895925636/mint-validate java

收錄地址:http://www.oschina.net/p/mint-validate git

工具包中有4個主要類,他們是Valid, Verifiable, VerificationResult, Verifier。 正則表達式

Valid

Valid是註解,做用在bean類的字段上,用來配置驗證的參數,一共四個參數: 數據庫

  1. rule。字符串數組類型,配置自定義的驗證器名,名字不分大小寫
  2. pattern。字符串數組類型,配置用於驗證字段的正則表達式
  3. tipMsg。字符串類型。配合正則表達式驗證用,當正則驗證不經過是,用於提示
  4. params。字符串數組類型。配合自定義驗證器使用,自定義一些定義的參數傳遞到驗證器內部

Verifiable

Verifiable是抽象類,須要驗證的bean類必須繼承該類。Verifiable有兩個公共方法: 數組

  1. public final boolean validate(String... fields)。驗證bean的字段,當參數中不指定字段名字時,默認驗證全部可驗證字段(標註有Valid的字段)。若是全部規則都驗證經過,返回true;有一個規則驗證不經過都將返回false。
  2. public Set<VerificationResult> getValidateResult()。獲取全部的驗證結果。調用validate方法作驗證時,全部的規則的驗證結果都會封裝成Verification保存在一個Set內。該方法能夠獲取這些結果

VerificationResult

VerificationResult封裝驗證結果。記錄一個驗證規則的5個驗證信息: ide

  1. fieldName。String類型,被驗證字段的字段名。
  2. fieldValue。Object類型。被驗證字段的值。
  3. verifier。String類型。驗證該字段對應的規則名。
  4. tipMsg。String類型。自定義的驗證提示信息。
  5. result。boolean類型。驗證結果true or false。

Verifier

Verifier是一個接口,全部自定義驗證器都須要實現該接口,而且實現他惟一的方法:public VerificationResult verify(Object bean, Class<?> fieldType, Object fieldValue, String fieldName, String[] params)。verify 方法會被Verifiable 的 validate經過反射調用。該方法5個參數的含義以下: 工具

  1. bean。被驗證的bean對象。這在二維驗證時用到,好比「字段1」和「字段2」 知足必定的關係才能經過驗證的狀況
  2. fieldType。被驗證字段的java類型。
  3. fieldValue。被驗證字段的值。
  4. fieldName。被驗證字段的名字。
  5. params。驗證時須要用到的一些參數。好比在驗證密碼長度時,不能小於6個字符,又不能多於32個字符,就能夠經過params指定。

方法的返回值將參考VerificationResult,返回值會被Verifiable保存,並經過Verifiable的getValidateResult得到。 this

工具包的用法

先亮出demo中用到的兩個bean,方便起見,不寫getter 和 setter。 spa

People繼承Verifiable: .net

package test;

import mint.validate.Valid;
import mint.validate.Verifiable;

public class People extends Verifiable{
	public int gender;
	
	@Valid(rule="notnull")
	public String address;
}

User 繼承 People:

package test;

import mint.validate.Valid;

public class User extends People{
	/*採用正則表達式驗證(可配置多個正則表達式)*/
	@Valid(tipMsg="郵箱地址不正確", pattern={"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"})
	public String email;
	
	/*簡單驗證器驗證*/
	@Valid(rule="notnull")
	public String username;
	
	/*採用驗證器驗證,並給驗證器傳遞參數*/
	@Valid(rule={"LenLimit"}, params={"6", "32"})
	public String password;
}

正則表達式驗證

正則表達式驗證很簡單。

只要在字段上作以下配置就行,tipMsg能夠不配置,正則能夠配置多個:

@Valid(tipMsg="郵箱地址不正確", pattern={"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"})
public String email;

對象中調用validate方法就能夠採用配置的正則去驗證該字段了。

u.validate("email");

驗證器驗證

驗證器驗證的過程會複雜一些。一共分三步:定義驗證器、註冊驗證器、使用驗證器

定義驗證器

驗證器的定義須要遵循兩個約定:

  1. 實現Verifier類
  2. 類名格式必須是:{驗證器名字}+Verifier,驗證器名字不區分大小寫,好比 NotNullVerifier和NotnullVerifier是同樣的。

看一個例子:

package verifiers;

import mint.validate.ValidateException;
import mint.validate.VerificationResult;
import mint.validate.Verifier;

public class LenLimitVerifier implements Verifier{
	@Override
	public VerificationResult verify(Object bean, Class<?> fieldType, Object fieldValue, String fieldName, String[] params) {
		if(fieldValue == null) return new VerificationResult(fieldName, "lenlimit", "字段值爲空",	 null, false);
		
		if(params.length < 2){
			throw new ValidateException("沒有指定合適參數");
		}
		
		int min, max;
		try{
			min = Integer.parseInt(params[0]); 
			max = Integer.parseInt(params[1]);
		} catch (NumberFormatException e){
			e.printStackTrace();
			throw new ValidateException("參數格式錯誤,沒法轉換成數字");
		}
		
		int len = ((String)fieldValue).length();
		if(len < min){
			return new VerificationResult(fieldName, "lenlimit", fieldName+"不能少於"+min+"個字符", fieldValue, false);
		}
		
		if(len > max){
			return new VerificationResult(fieldName, "lenlimit", fieldName+"不能多於"+max+"個字符", fieldValue, false);
		}
		return null;
	}
}
以上一個驗證器的名字是LenLimit(使用時不區分大小寫),用於驗證一個String 字段的長度不能小於6字符並且不能大於32字符。

註冊驗證器

註冊驗證器須要在class目錄下建立一個properties文件。以下圖:

裏面只寫一個屬性packages,屬性值是自定義驗證器所在的包,多個包用「;」(英文分號)隔開。like this:

packages=verifiers
這樣驗證工具在啓動時就會自動去指定的包下掃描自定義驗證器了。

使用驗證器

這一步跟正則表達式的用法差很少,就在對應的字段上配置驗證器:

/*採用驗證器驗證,並給驗證器傳遞參數*/
@Valid(rule={"LenLimit"}, params={"6", "32"})
public String password;
由於LenLimitVerifier是驗證長度限制的,因此用params配置兩個表示長度限制的參數。

調用驗證:

User u = new User();
u.password = "passw";
System.out.println(u.validate("password"));
for(VerificationResult r : u.getValidateResult()){
	System.out.println(r);
}

查看結果:

ps:自定義驗證器靈活功能強,能夠二維驗證,能夠結合數據庫驗證,反正邏輯隨你寫。

再寫兩個例子做爲結束

驗證父類中的字段。address字段在父類People中:

User u = new User();
u.address = "中國廣東";
u.validate("address");
for(VerificationResult r : u.getValidateResult()){
    System.out.println(r);
}
驗證全部配置了Valid註解的字段:
User u = new User();
		
u.email = "895925636#qq.com";
u.password = "passw";
u.address = "中國廣東";

/*不寫字段名*/
u.validate();
		
for(VerificationResult r : u.getValidateResult()){
	System.out.println(r);
}
歡迎討論指正。。。
相關文章
相關標籤/搜索