基於java反射的驗證框架 – JAVA編程語言程序開發技術文章

<h1>寫在前面</h1>相信很多經歷瞭項目的人,會發現幾乎沒有哪個項目不需要驗證的。在經歷過多個項目之後,有感於項目中使用最多的驗證方式,這裡寫瞭一個基於java反射機制的驗證框架。該框架適用於對javabean中的屬性通過java反射機制獲取對應的值和用戶直接傳入的值來進行各種規則的驗證。由於其幾乎不依賴任何第三方jar包,因此可以適用所有java項目中。
<h1>開始使用</h1><br>1、由於這些代碼是在jdk1.5環境下編寫的,用到瞭jdk1.5中的一些高級特性(如泛型等),因此使用該框架的項目最好是基於jdk1.5及以上版本的。<br>2、使用方式。<br>在這個框架中,整個使用的入口就是一個工具類:com.cloudframework.validation.validatorutils。具體使用示例如下(示例代碼在com.cloudframework.validation.sample.demo):
Java代碼 
demoentity de = new demoentity();//demoentity是一個javabean。  // 普通使用  cloudbindingresult result = validatorutils.validateentity(de, "str", notemptyrule.class);  system.out.println(result.getfielderrormessage("str"));  // 自定義驗證信息  result = validatorutils.validateentity(de, "str", new notemptyrule("這裡是指定驗證信息示范!"));  system.out.println(result.getfielderrormessage("str"));  // 同時驗證兩個屬性  result = validatorutils.validateentity(de, "num,date", notnullrule.class);  system.out.println(result.getfielderrormessage("num") + " || " + result.getfielderrormessage("date"));  // 使用多個驗證規則  result = validatorutils.validateentity(de, "str", notemptyrule.class, singleemailrule.class);  system.out.println(result.getfielderrormessage("str"));// 這裡註意其打印出來的驗證信息!  // 多個屬性同時使用多個規則  result = validatorutils.validateentity(de, "str,col", notemptyrule.class, singleemailrule.class);  system.out.println(result.getfielderrormessage("str") + " || " + result.getfielderrormessage("col")); 
 <br>其運行結果為:
Java代碼 
不能為空!這裡是指定驗證信息示范!不能為空! || 不能為空!不能為空!;郵箱格式不正確!不能為空!;郵箱格式不正確! || 不能為空!;郵箱格式不正確! 
 <br>3、 需要註意的是,有時候,我們需要驗證一個單獨的字符串或數字是否符合某個規則,這時候,這樣的值並不是javabean中的值,在這樣的情況下,validatorutils中的validatevalue方法正是解決這樣的單獨驗證的,它是可以直接驗證給定的內容的。示例如下:
Java代碼 
// 註意下面方法的返回值,是string類型。system.out.println(validatorutils.validatevalue("hello",notemptyrule.class,singleemail.class)); system.out.println(validatorutils.validatevalue("",notemptyrule.class,singleemail.class)); system.out.println(validatorutils.validatevalue(null,notemptyrule.class,singleemail.class)); system.out.println(validatorutils.validatevalue("hello",notemptyrule.class)); 
 <br>其運行結果如下:
Java代碼 
郵箱格式不正確!不能為空!;郵箱格式不正確!不能為空!;郵箱格式不正確! 
 
<h1>自定義規則</h1><br>在上面的使用中,我們用到瞭這些規則:notemptyrule、notnullrule、singleemailrule。這些規則是我已經在框架中提供的僅有的三種規則!對於業務復雜、規則眾多的情況下,用戶可以自己擴展這些規則。擴展的方式為:新建一個類,並實現自com.cloudframework.validation.rules.validaterule接口。該接口代碼如下:
Java代碼 
package com.cloudframework.validation.rules;/** * 驗證規則的接口。所有的具體驗證規則都實現自這個接口。 *  * @author taofucheng *  */public interface validaterule { /**  * 進行具體規則的驗證邏輯。  *   * @param value  *            具體的驗證內容。  * @return true:驗證通過;false:驗證不通過  */ public boolean validate(object value); /**  * 獲取驗證不通過時的報錯信息。如果用戶指定的驗證信息為空,則返回默認的報錯信息。  *   * @return 返回驗證的報錯信息  */ public string getvalidateinfo();} 
 <br>具體實現和規則的使用的示例可以參考現有的這三個規則類(notemptyrule、notnullrule、singleemailrule)。
<h1>設計</h1><br>在整個框架的設計中,其設計思路很簡單:調用入口到反射取值,調用規則驗證。其uml圖可示例如下(使用staruml作圖):<br><img src="/wp-content/images1/20181012/20110817011816414483.jpg" alt="uml圖" width="901" height="695">
設計思想與各關系上圖中已經詳細表明瞭,這裡就不贅述瞭。
<h1>後記</h1><h2><br>現有的不足</h2><br>字段名稱不宜控制。現在的使用方式為:validatorutils.validateentity(entity, "field1", notemptyrule.class),其中字段名稱是用戶傳入的字符串,如果該實體中的字符串名稱發生改變,則這裡是無法知曉的!也就是說,這裡會因為實體中的字段名稱變化而形成一個極隱蔽的隱患!
<h2><br>可擴展為註解</h2>在現在這個年頭,註解(annotation)似乎已經很被大眾接受,同時也流行開瞭,從spring到hibernate,再到struts……<br>在註解風靡的現在,如果這個驗證框架沒有註解使用方式估計會少瞭一席戰場吧。由於本人急於使用,再加上最近也一直很忙,靜不下心來完善,所以上面提到的註解功能就一直沒寫。其實,註解的實現很簡單,建議大傢可以參考一下hibernate validator框架,我覺得這個驗證框架很不錯,它是完全基於註解的。我也會在後面的某一天將註解的內容補充完整。
<h2>補充</h2><br>1、 對於驗證中的字段名稱隨實體改變而不會留下隱患,我一直找不到一個好的辦法解決。想想除瞭用註解的方式,還真沒找到一個合適的方式。<br>2、 對於註解的使用,我個人認為對於代碼的侵入性比較強。我想這也許就是為什麼很多人對註解有一定的抵觸情緒吧。<br>3、 這個驗證框架,隻是依賴於commons-lang.jar包,但隻用到瞭其中的stringutils類,如果將該類中用到的功能自己實現的話,可以不依賴於任何jar包瞭!

發佈留言