這是一個驗證架構,并且是一個 獨立的驗證架構 ,不依賴與其他已有的架構;
可以自由的嵌入到其他架構,比如Spring、Struts等流行架構,但實質來說他是獨立的,是以無所謂嵌入到哪裡,如果需要在GUI桌面應用中,也是完美的;
配置簡單,可自由擴充驗證器,實際隻要實作IValidator接口,以及在rules.fo.xml中添加相關的配置即可;
支援Spring接口
使用過程中,你會感覺好像隻用了 <code>IValidateService.validate()</code> 一個方法,這會讓人感覺良好
不與任何對象做綁定,最大限度解耦
隻要規則配置寫的合理,規則可以複用到多個對象
擴充驗證器很簡單
以Map存儲驗證結果,非常簡單的導出JSON,隻要你願意
1
2
3
4
5
<code><</code><code>dependency</code><code>></code>
<code> </code><code><</code><code>groupId</code><code>>cc.fozone.validation</</code><code>groupId</code><code>></code>
<code> </code><code><</code><code>artifactId</code><code>>fo-validation</</code><code>artifactId</code><code>></code>
<code> </code><code><</code><code>version</code><code>>0.9.1.RELEASE</</code><code>version</code><code>></code>
<code></</code><code>dependency</code><code>></code>
配置驗證規則 <code>rules.fo.xml</code>
執行個體化 <code>IValidateService</code> 對象
調用 <code>IValidateService.validate</code> 方法
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<code>package</code> <code>validationfo.basic;</code>
<code>import</code> <code>java.sql.Timestamp;</code>
<code>/**</code>
<code> </code><code>* 使用者對象</code>
<code> </code><code>* @author Jimmy Song</code>
<code> </code><code>*</code>
<code> </code><code>*/</code>
<code>public</code> <code>class</code> <code>User {</code>
<code> </code><code>// 使用者名</code>
<code> </code><code>private</code> <code>String username;</code>
<code> </code>
<code> </code><code>// 密碼</code>
<code> </code><code>private</code> <code>String password;</code>
<code> </code><code>// 再次輸入密碼</code>
<code> </code><code>private</code> <code>String passwordOne;</code>
<code> </code><code>// 郵箱</code>
<code> </code><code>private</code> <code>String email;</code>
<code> </code><code>// 開始與結束時間</code>
<code> </code><code>private</code> <code>Timestamp starttime;</code>
<code> </code><code>private</code> <code>Timestamp endtime;</code>
<code> </code><code>/**</code>
<code> </code><code>* Setter & Getter</code>
<code> </code><code>*/</code>
<code> </code><code>...</code>
<code>}</code>
<code><include file=""/></code>
導入其他規則檔案
<code><group name=""></group></code>
驗證分組,name應該為全局唯一的
<code><field name=""></field></code>
驗證的字段,name是被驗證對象的屬性字段名
<code><rule name="" message=""></rule></code>
驗證規則,name是驗證器名稱,message是錯誤後傳回的消息
<code><param name="" value=""></param></code>
是驗證規則時可能需要傳入的參數,name是參數名,value是參數值
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?></code>
<code><</code><code>fozone-validation</code><code>></code>
<code> </code><code><!-- include 标簽導入其他配置 --></code>
<code> </code><code><</code><code>include</code> <code>file</code><code>=</code><code>"validationinfo/basic/another-rules.fo.xml"</code><code>/></code>
<code> </code>
<code> </code><code><!-- 驗證組ID,全局唯一 --></code>
<code> </code><code><</code><code>group</code> <code>name</code><code>=</code><code>"user.validate"</code><code>></code>
<code> </code><code><!-- 驗證字段 --></code>
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"email"</code><code>></code>
<code> </code><code><!-- </code>
<code> </code><code>規則清單</code>
<code> </code><code>--></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"required"</code> <code>message</code><code>=</code><code>"郵件必須填寫"</code><code>/></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"between"</code> <code>message</code><code>=</code><code>"郵件長度應該3-100之間"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"min"</code> <code>value</code><code>=</code><code>"3"</code><code>/></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"max"</code> <code>value</code><code>=</code><code>"100"</code><code>/></code>
<code> </code><code></</code><code>rule</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"match"</code> <code>message</code><code>=</code><code>"郵件格式不正确"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"regex"</code> <code>value</code><code>=</code><code>"^[A-Za-z]+[\.\-_A-Za-z0-9]*@[A-Za-z0-9]+[\.\-_A-Za-z0-9]*$"</code><code>/></code>
<code> </code><code></</code><code>rule</code><code>></code>
<code> </code><code></</code><code>field</code><code>></code>
<code> </code><code>...</code>
<code> </code><code></</code><code>group</code><code>></code>
<code></</code><code>fozone-validation</code><code>></code>
主要步驟:
建立配置讀取對象<code>IValidateConfig</code>
建立驗證服務對象<code>IValidateService</code>
執行驗證方法<code>IValidateService.validate(object, groupId)</code>
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<code>...</code>
<code> </code><code>* 最基本的測試</code>
<code>public</code> <code>class</code> <code>BasicTest {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args) {</code>
<code> </code><code>/**</code>
<code> </code><code>* Validation.FO的配置資源</code>
<code> </code><code>*/</code>
<code> </code><code>// 驗證器配置,系統預設配置</code>
<code> </code><code>String validatorsXML = </code><code>"validationfo/basic/validators.fo.xml"</code><code>;</code>
<code> </code><code>// 規則配置</code>
<code> </code><code>String rulesXML = </code><code>"validationfo/basic/rules.fo.xml"</code><code>;</code>
<code> </code>
<code> </code><code>* 執行個體化配置對象</code>
<code> </code><code>IValidateConfig config =</code><code>new</code> <code>BasicValidateConfig(validatorsXML, rulesXML);</code>
<code> </code><code>* 執行個體化驗證服務層</code>
<code> </code><code>IValidateService validateService = </code><code>new</code> <code>BasicValidateService(config);</code>
<code> </code><code>// 執行個體化使用者</code>
<code> </code><code>User user = createUser();</code>
<code> </code><code>* 執行驗證</code>
<code> </code><code>Map<String,String> map = validateService.validate(user, </code><code>"user.validate"</code><code>);</code>
<code> </code><code>// 輸出結果</code>
<code> </code><code>if</code><code>(map == </code><code>null</code> <code>|| map.size() == </code><code>0</code><code>) {</code>
<code> </code><code>System.out.println(</code><code>"驗證成功"</code><code>);</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>System.out.println(</code><code>"驗證失敗,結果如下"</code><code>);</code>
<code> </code><code>System.out.println(map);</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code>12</code><code>:</code><code>31</code><code>:</code><code>41</code><code>,</code><code>084</code> <code>INFO BasicValidateConfig:</code><code>44</code> <code>- read validation main file , validationfo/basic/rules.fo.xml</code>
<code>驗證失敗,結果如下</code>
<code>{email=郵件格式不正确, password=兩次密碼輸入不正确, starttime=開始時間不能大于結束時間, endtime=結束時間不能小于開始時間}</code>
在Spring中需要使用 <code>SpringValidateConfg</code> 配置對象
需要額外配置 <code>SpringValidator</code> Bean對象
<a href="https://github.com/jimmy-song/fo-jimmysong-demo/tree/master/src/main/java/validationfo/spring" target="_blank">Spring DEMO 源代碼下載下傳</a>
<code><</code><code>beans</code> <code>xmlns</code><code>=</code><code>"http://www.springframework.org/schema/beans"</code>
<code> </code><code>xmlns:xsi</code><code>=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code><code>></code>
<code> </code><code><!-- 基于 Spring 配置讀取 --></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"springValidateConfig"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.config.SpringValidateConfig"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"validators"</code><code>></code>
<code> </code><code><</code><code>value</code><code>>validationfo/spring/validators.fo.xml</</code><code>value</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"rules"</code><code>></code>
<code> </code><code><</code><code>value</code><code>>validationfo/spring/rules.fo.xml</</code><code>value</code><code>></code>
<code> </code><code></</code><code>bean</code><code>></code>
<code> </code><code><!-- 配置驗證服務 --></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"basicValidateService"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.BasicValidateService"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>ref</code><code>=</code><code>"springValidateConfig"</code><code>/></code>
<code> </code><code><!-- 配置基于Spring的驗證器 --></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.SpringValidator"</code><code>/></code>
<code></</code><code>beans</code><code>></code>
<code>public</code> <code>class</code> <code>SpringTest {</code>
<code> </code><code>ClassPathXmlApplicationContext context = </code><code>new</code> <code>ClassPathXmlApplicationContext(</code>
<code> </code><code>"validationfo/spring/context.xml"</code><code>);</code>
<code> </code><code>// 擷取驗證服務</code>
<code> </code><code>IValidateService service = context.getBean(IValidateService.</code><code>class</code><code>);</code>
<code> </code><code>// 建立使用者對象</code>
<code> </code><code>// 執行驗證</code>
<code> </code><code>Map<String, String> map = service.validate(user, </code><code>"user.validate"</code><code>);</code>
<code> </code><code>if</code> <code>(map == </code><code>null</code> <code>|| map.size() == </code><code>0</code><code>) {</code>
<code>13</code><code>:</code><code>26</code><code>:</code><code>00</code><code>,</code><code>150</code> <code>INFO ClassPathXmlApplicationContext:</code><code>510</code> <code>- Refreshing org.springframework.context.support.ClassPathXmlApplicationContext</code><code>@283b4947</code><code>: startup date [Tue Oct </code><code>07</code> <code>13</code><code>:</code><code>26</code><code>:</code><code>00</code> <code>CST </code><code>2014</code><code>]; root of context hierarchy</code>
<code>13</code><code>:</code><code>26</code><code>:</code><code>00</code><code>,</code><code>194</code> <code>INFO XmlBeanDefinitionReader:</code><code>315</code> <code>- Loading XML bean definitions from </code><code>class</code> <code>path resource [validationfo/spring/context.xml]</code>
<code>13</code><code>:</code><code>26</code><code>:</code><code>00</code><code>,</code><code>373</code> <code>INFO DefaultListableBeanFactory:</code><code>598</code> <code>- Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory</code><code>@212b0f8a</code><code>: defining beans [springValidateConfig,basicValidateService,cc.fozone.validation.validators.SpringValidator#</code><code>0</code><code>]; root of factory hierarchy</code>
<code>13</code><code>:</code><code>26</code><code>:</code><code>00</code><code>,</code><code>442</code> <code>INFO BasicValidateConfig:</code><code>44</code> <code>- read validation main file , validationfo/spring/rules.fo.xml</code>
系統預設的驗證器檔案 <code>validators.fo.xml</code>
<code><</code><code>fozone-validators</code><code>></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"required"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.RequiredValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"match"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.MatchValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"between"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.BetweenValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"min"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.MinValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"max"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.MaxValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"equals"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.EqualsValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"timestampLessEqual"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.TimestampLessEqualValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"timestampCreaterEqual"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.TimestampCreaterEqualValidator"</code><code>/></code>
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"spring"</code> <code>useSpring</code><code>=</code><code>"true"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.SpringValidator"</code><code>/></code>
<code></</code><code>fozone-validators</code><code>></code>
消息message: 必填
參數param: 無
案例:
<code><</code><code>group</code> <code>name</code><code>=</code><code>"user.validate"</code><code>></code>
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"username"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"required"</code> <code>message</code><code>=</code><code>"姓名必須填寫。"</code><code>/></code>
<code> </code><code></</code><code>field</code><code>></code>
<code></</code><code>group</code><code>></code>
參數param: 有
Name
Must
Description
regex
Yes
正規表達式,如果為空,驗證直接傳回true
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"email"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"match"</code> <code>message</code><code>=</code><code>"郵件格式不正确"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"regex"</code> <code>value</code><code>=</code><code>"^[A-Za-z]+[\.\-_A-Za-z0-9]*@[A-Za-z0-9]+[\.\-_A-Za-z0-9]*$"</code><code>/></code>
消息message: 必填
min
最小長度(包含)
max
最大長度(包含)
value
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"password"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"min"</code> <code>message</code><code>=</code><code>"密碼至少5個字元"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"5"</code><code>/></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"max"</code> <code>message</code><code>=</code><code>"密碼最多20個字元"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"20"</code><code>/></code>
target
指定的字段名稱,并非确定的值
POJO對象部分字段
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"equals"</code> <code>message</code><code>=</code><code>"兩次輸入的密碼不相同"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"passwordOne"</code><code>/></code>
注:這裡會将<code>password</code>與目标<code>passwordOne</code>字段的值進行<code>equals</code>比較 有些時候你可能需要重寫<code>equals</code>方法
指定的時間字段名稱,并非确定的值
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"starttime"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"timestampLessEqual"</code> <code>message</code><code>=</code><code>"開始時間不能大于結束時間"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"endtime"</code><code>/></code>
注:
這裡會将<code>starttime</code>與目标<code>endtime</code>字段的值進行大小比較
這裡的字段必須是<code>java.sql.Timestamp</code>類型
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"endtime"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"timestampCreaterEqual"</code> <code>message</code><code>=</code><code>"結束時間不能小于開始時間"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"starttime"</code><code>/></code>
這裡會将<code>endtime</code>與目标<code>starttime</code>字段的值進行大小比較
beanName
Spring Context中的Bean辨別
methodName
Bean對象中的指定執行方法,該方法必須傳回 boolean 類型
parameterName
No
執行方法中傳遞的參數,**預設** 傳遞被驗證字段的值,如果使用**this** 表示傳遞被驗證的對象, 其他 表示傳遞對象指定的字段
<code> </code><code>private</code> <code>int</code> <code>usernameLength;</code>
驗證配置
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"該使用者已存在"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"beanName"</code> <code>value</code><code>=</code><code>"userService"</code><code>/></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"exist"</code><code>/></code>
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"usernameLength"</code><code>></code>
<code> </code><code><!-- 使用 this 關鍵字 --></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"使用者名長度驗證錯誤"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"length"</code><code>/></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"parameter"</code> <code>value</code><code>=</code><code>"this"</code><code>/></code>
<code> </code><code><!-- 指定字段 --></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"使用者名長度不能小于5個字元"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"lengthByName"</code><code>/></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"parameter"</code> <code>value</code><code>=</code><code>"username"</code><code>/></code>
Spring中的配置
<code><</code><code>beans</code><code>></code>
<code> </code><code><!-- 通過Spring進行驗證 --></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"userService"</code> <code>class</code><code>=</code><code>"validationfo.springadvance.UserService"</code><code>/></code>
通過Spring驗證的接口
<code>package</code> <code>validationfo.springadvance;</code>
<code>public</code> <code>class</code> <code>UserService {</code>
<code> </code><code>public</code> <code>boolean</code> <code>exist(String value) {</code>
<code> </code><code>return</code> <code>!</code><code>"superman"</code><code>.equals(value);</code>
<code> </code><code>public</code> <code>boolean</code> <code>length(User user){</code>
<code> </code><code>return</code> <code>user.getUsername().length() == user.getUsernameLength();</code>
<code> </code><code>public</code> <code>boolean</code> <code>lengthByName(String username){</code>
<code> </code><code>return</code> <code>username.length() >= </code><code>5</code><code>;</code>
要啟用spring配置,需要參照上述的 如何在Spring使用 進行Spring與Validation.FO的整合配置
指定的對象方法必須傳回 boolean 類型
實作 <code>IValidator</code> 接口
在 <code>validators.fo.xml</code> 驗證器配置中添加已實作的驗證器
<a href="https://github.com/jimmy-song/fo-jimmysong-demo/tree/master/src/main/java/validationfo/custom" target="_blank">點選這裡檢視Demo源代碼</a>
POJO對象
<code>package</code> <code>validationfo.custom;</code>
<code>public</code> <code>class</code> <code>Money {</code>
<code> </code><code>private</code> <code>int</code> <code>number;</code>
<code> </code><code>private</code> <code>String text;</code>
CustomValidator實作
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<code> </code><code>* 構造一個判斷 參數 是否能夠被 指定的值 整出的驗證器</code>
<code> </code><code>* 例如:對象值為4 ,驗證參數為2,那麼 4可以被2整除,表示成功</code>
<code> </code><code>* </code>
<code>public</code> <code>class</code> <code>CustomValidator </code><code>implements</code> <code>IValidator {</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>Logger logger = Logger.getLogger(CustomValidator.</code><code>class</code><code>);</code>
<code> </code><code>* 要處理的對象</code>
<code> </code><code>* @param context 上下文</code>
<code> </code><code>* @param type 對象類型</code>
<code> </code><code>* @param value 對象值</code>
<code> </code><code>* @param rule 對象參數</code>
<code> </code><code>* @return 是否成功</code>
<code> </code><code>*/</code>
<code> </code><code>public</code> <code>boolean</code> <code>execute(Object context, Class type, Object value, Rule rule) {</code>
<code> </code><code>// TODO Auto-generated method stub</code>
<code> </code><code>* 這裡隻是示範一下context的用處</code>
<code> </code><code>* 可以通過context以及反射擷取對象的屬性值</code>
<code> </code><code>* 舉個例子</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>System.out.println(</code><code>"TEXT = "</code><code>+PropertyUtils.getProperty(context, </code><code>"text"</code><code>));</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e1) {</code>
<code> </code><code>// TODO Auto-generated catch block</code>
<code> </code><code>* 通過 value 實際驗證的值</code>
<code> </code><code>if</code><code>(value == </code><code>null</code><code>) </code><code>return</code> <code>true</code><code>;</code>
<code> </code><code>* 通過 type 擷取值的類型</code>
<code> </code><code>if</code><code>(!(type == Integer.</code><code>class</code> <code>|| type == </code><code>int</code><code>.</code><code>class</code><code>)) {</code>
<code> </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>int</code> <code>objectValue = ((Integer)value).intValue();</code>
<code> </code><code>* 通過 rule 擷取規則參數</code>
<code> </code><code>String toValue = rule.getParameter(</code><code>"value"</code><code>);</code>
<code> </code><code>if</code><code>(StringUtils.isBlank(toValue)) </code><code>return</code> <code>false</code><code>;</code>
<code> </code><code>int</code> <code>intValue = -</code><code>1</code><code>;</code>
<code> </code><code>intValue = Integer.parseInt(toValue);</code>
<code> </code><code>} </code><code>catch</code><code>(NumberFormatException e){</code>
<code> </code><code>logger.error(</code><code>"倍數值轉換錯誤!"</code><code>);</code>
<code> </code><code>if</code><code>(intValue <= </code><code>0</code><code>) {</code>
<code> </code><code>logger.warn(</code><code>"倍數值不能小于等于0"</code><code>);</code>
<code> </code><code>return</code> <code>objectValue % intValue == </code><code>0</code><code>;</code>
配置 validators.fo.xml 中添加自定義驗證器
關于validators.fo.xml配置的參數說明
文法 : <code><validator name="" useSpring="true|false" class="" beanId=""/></code>
參數名
必填
含義
name
是
驗證器名稱
useSpring
否
是否通過 Spring 執行個體化驗證器,這樣做可以為驗證器注入 ApplicationContext
class
當 useSpring=false 時,按照正常的方式進行執行個體化;當 useSpring=true 時,且使用了 beanId ,則 class 無效,如果沒有使用 beanId ,那麼 Spring 通過 class 進行執行個體化
beanId
Spring中的bean id
<code> </code><code><</code><code>validator</code> <code>name</code><code>=</code><code>"custom"</code> <code>class</code><code>=</code><code>"validationfo.custom.CustomValidator"</code><code>/></code>
配置驗證規則
<code> </code><code><</code><code>group</code> <code>name</code><code>=</code><code>"money.validate"</code><code>></code>
<code> </code><code><</code><code>field</code> <code>name</code><code>=</code><code>"number"</code><code>></code>
<code> </code><code><</code><code>rule</code> <code>name</code><code>=</code><code>"custom"</code> <code>message</code><code>=</code><code>"驗證失敗,不能被指定的數整除"</code><code>></code>
<code> </code><code><</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"3"</code><code>/></code>
執行測試
<code>public</code> <code>class</code> <code>CustomTest {</code>
<code> </code><code>String validatorsXML = </code><code>"validationfo/custom/validators.fo.xml"</code><code>;</code>
<code> </code><code>String rulesXML = </code><code>"validationfo/custom/rules.fo.xml"</code><code>;</code>
<code> </code><code>// 執行個體化資料</code>
<code> </code><code>Money money = </code><code>new</code> <code>Money();</code>
<code> </code><code>money.setNumber(</code><code>7</code><code>);</code>
<code> </code><code>money.setText(</code><code>"示範Context使用的Text"</code><code>);</code>
<code> </code><code>Map<String,String> map = validateService.validate(money, </code><code>"money.validate"</code><code>);</code>
<code> </code><code>} </code>
結果輸出
<code>16</code><code>:</code><code>44</code><code>:</code><code>17</code><code>,</code><code>178</code> <code>INFO BasicValidateConfig:</code><code>44</code> <code>- read validation main file , validationfo/custom/rules.fo.xml</code>
<code>TEXT = 示範Context使用的Text</code>
<code>{number=驗證失敗,不能被指定的數整除}</code>
本文轉自 sundunjam 51CTO部落格,原文連結:http://blog.51cto.com/sunspot/1561016,如需轉載請自行聯系原作者