天天看點

【狂人小白】輕量級驗證架構 Validation.FO 的入門與使用

這是一個驗證架構,并且是一個 獨立的驗證架構 ,不依賴與其他已有的架構;

可以自由的嵌入到其他架構,比如Spring、Struts等流行架構,但實質來說他是獨立的,是以無所謂嵌入到哪裡,如果需要在GUI桌面應用中,也是完美的;

配置簡單,可自由擴充驗證器,實際隻要實作IValidator接口,以及在rules.fo.xml中添加相關的配置即可;

支援Spring接口

使用過程中,你會感覺好像隻用了 <code>IValidateService.validate()</code> 一個方法,這會讓人感覺良好

不與任何對象做綁定,最大限度解耦

隻要規則配置寫的合理,規則可以複用到多個對象

擴充驗證器很簡單

以Map存儲驗證結果,非常簡單的導出JSON,隻要你願意

1

2

3

4

5

<code>&lt;</code><code>dependency</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>groupId</code><code>&gt;cc.fozone.validation&lt;/</code><code>groupId</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>artifactId</code><code>&gt;fo-validation&lt;/</code><code>artifactId</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>version</code><code>&gt;0.9.1.RELEASE&lt;/</code><code>version</code><code>&gt;</code>

<code>&lt;/</code><code>dependency</code><code>&gt;</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 &amp; Getter</code>

<code>    </code><code>*/</code>

<code>    </code><code>...</code>

<code>}</code>

<code>&lt;include file=""/&gt;</code>

導入其他規則檔案

<code>&lt;group name=""&gt;&lt;/group&gt;</code>

驗證分組,name應該為全局唯一的

<code>&lt;field name=""&gt;&lt;/field&gt;</code>

驗證的字段,name是被驗證對象的屬性字段名

<code>&lt;rule name="" message=""&gt;&lt;/rule&gt;</code>

驗證規則,name是驗證器名稱,message是錯誤後傳回的消息

<code>&lt;param name="" value=""&gt;&lt;/param&gt;</code>

是驗證規則時可能需要傳入的參數,name是參數名,value是參數值

<code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;</code><code>fozone-validation</code><code>&gt;</code>

<code>    </code><code>&lt;!-- include 标簽導入其他配置 --&gt;</code>

<code>    </code><code>&lt;</code><code>include</code> <code>file</code><code>=</code><code>"validationinfo/basic/another-rules.fo.xml"</code><code>/&gt;</code>

<code>     </code> 

<code>    </code><code>&lt;!-- 驗證組ID,全局唯一 --&gt;</code>

<code>    </code><code>&lt;</code><code>group</code> <code>name</code><code>=</code><code>"user.validate"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 驗證字段 --&gt;</code>

<code>        </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"email"</code><code>&gt;</code>

<code>            </code><code>&lt;!-- </code>

<code>                </code><code>規則清單</code>

<code>            </code><code>--&gt;</code>

<code>            </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"required"</code> <code>message</code><code>=</code><code>"郵件必須填寫"</code><code>/&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"between"</code> <code>message</code><code>=</code><code>"郵件長度應該3-100之間"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"min"</code> <code>value</code><code>=</code><code>"3"</code><code>/&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"max"</code> <code>value</code><code>=</code><code>"100"</code><code>/&gt;</code>

<code>        </code><code>&lt;/</code><code>rule</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"match"</code> <code>message</code><code>=</code><code>"郵件格式不正确"</code><code>&gt;</code>

<code>                </code><code>&lt;</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>/&gt;</code>

<code>            </code><code>&lt;/</code><code>rule</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>field</code><code>&gt;</code>

<code>        </code><code>...</code>

<code>    </code><code>&lt;/</code><code>group</code><code>&gt;</code>

<code>&lt;/</code><code>fozone-validation</code><code>&gt;</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&lt;String,String&gt; 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>&lt;</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>&gt;</code>

<code>    </code><code>&lt;!-- 基于 Spring 配置讀取 --&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>        </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"validators"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;validationfo/spring/validators.fo.xml&lt;/</code><code>value</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"rules"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>value</code><code>&gt;validationfo/spring/rules.fo.xml&lt;/</code><code>value</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 配置驗證服務 --&gt;</code>

<code>    </code><code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"basicValidateService"</code> <code>class</code><code>=</code><code>"cc.fozone.validation.BasicValidateService"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>constructor-arg</code> <code>index</code><code>=</code><code>"0"</code> <code>ref</code><code>=</code><code>"springValidateConfig"</code><code>/&gt;</code>

<code>    </code><code>&lt;!-- 配置基于Spring的驗證器 --&gt;</code>

<code>    </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"cc.fozone.validation.validators.SpringValidator"</code><code>/&gt;</code>

<code>&lt;/</code><code>beans</code><code>&gt;</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&lt;String, String&gt; 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>&lt;</code><code>fozone-validators</code><code>&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>&lt;/</code><code>fozone-validators</code><code>&gt;</code>

消息message: 必填

參數param: 無

案例:

<code>&lt;</code><code>group</code> <code>name</code><code>=</code><code>"user.validate"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"username"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"required"</code> <code>message</code><code>=</code><code>"姓名必須填寫。"</code><code>/&gt;</code>

<code>    </code><code>&lt;/</code><code>field</code><code>&gt;</code>

<code>&lt;/</code><code>group</code><code>&gt;</code>

參數param: 有

Name

Must

Description

regex

Yes

正規表達式,如果為空,驗證直接傳回true

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"email"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"match"</code> <code>message</code><code>=</code><code>"郵件格式不正确"</code><code>&gt;</code>

<code>            </code><code>&lt;</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>/&gt;</code>

消息message: 必填

min

最小長度(包含)

max

最大長度(包含)

value

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"password"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"min"</code> <code>message</code><code>=</code><code>"密碼至少5個字元"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"5"</code><code>/&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"max"</code> <code>message</code><code>=</code><code>"密碼最多20個字元"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"20"</code><code>/&gt;</code>

target

指定的字段名稱,并非确定的值

POJO對象部分字段

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"equals"</code> <code>message</code><code>=</code><code>"兩次輸入的密碼不相同"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"passwordOne"</code><code>/&gt;</code>

注:這裡會将<code>password</code>與目标<code>passwordOne</code>字段的值進行<code>equals</code>比較 有些時候你可能需要重寫<code>equals</code>方法

指定的時間字段名稱,并非确定的值

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"starttime"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"timestampLessEqual"</code> <code>message</code><code>=</code><code>"開始時間不能大于結束時間"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"endtime"</code><code>/&gt;</code>

注:

這裡會将<code>starttime</code>與目标<code>endtime</code>字段的值進行大小比較

這裡的字段必須是<code>java.sql.Timestamp</code>類型

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"endtime"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"timestampCreaterEqual"</code> <code>message</code><code>=</code><code>"結束時間不能小于開始時間"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"target"</code> <code>value</code><code>=</code><code>"starttime"</code><code>/&gt;</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>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"該使用者已存在"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"beanName"</code> <code>value</code><code>=</code><code>"userService"</code><code>/&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"exist"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"usernameLength"</code><code>&gt;</code>

<code>        </code><code>&lt;!-- 使用 this 關鍵字 --&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"使用者名長度驗證錯誤"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"length"</code><code>/&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"parameter"</code> <code>value</code><code>=</code><code>"this"</code><code>/&gt;</code>

<code>        </code><code>&lt;!-- 指定字段 --&gt;</code>

<code>        </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"spring"</code> <code>message</code><code>=</code><code>"使用者名長度不能小于5個字元"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"methodName"</code> <code>value</code><code>=</code><code>"lengthByName"</code><code>/&gt;</code>

<code>            </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"parameter"</code> <code>value</code><code>=</code><code>"username"</code><code>/&gt;</code>

Spring中的配置

<code>&lt;</code><code>beans</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 通過Spring進行驗證 --&gt;</code>

<code>    </code><code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"userService"</code> <code>class</code><code>=</code><code>"validationfo.springadvance.UserService"</code><code>/&gt;</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() &gt;= </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 &lt;= </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>&lt;validator name="" useSpring="true|false"  class=""  beanId=""/&gt;</code>

參數名

必填

含義

name

驗證器名稱

useSpring

是否通過 Spring 執行個體化驗證器,這樣做可以為驗證器注入 ApplicationContext

class

當 useSpring=false 時,按照正常的方式進行執行個體化;當 useSpring=true 時,且使用了 beanId ,則 class 無效,如果沒有使用 beanId ,那麼 Spring 通過 class 進行執行個體化

beanId

Spring中的bean id

<code>    </code><code>&lt;</code><code>validator</code> <code>name</code><code>=</code><code>"custom"</code> <code>class</code><code>=</code><code>"validationfo.custom.CustomValidator"</code><code>/&gt;</code>

配置驗證規則

<code>    </code><code>&lt;</code><code>group</code> <code>name</code><code>=</code><code>"money.validate"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>field</code> <code>name</code><code>=</code><code>"number"</code><code>&gt;</code>

<code>            </code><code>&lt;</code><code>rule</code> <code>name</code><code>=</code><code>"custom"</code> <code>message</code><code>=</code><code>"驗證失敗,不能被指定的數整除"</code><code>&gt;</code>

<code>                </code><code>&lt;</code><code>param</code> <code>name</code><code>=</code><code>"value"</code> <code>value</code><code>=</code><code>"3"</code><code>/&gt;</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&lt;String,String&gt; 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,如需轉載請自行聯系原作者