天天看点

【狂人小白】轻量级验证框架 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,如需转载请自行联系原作者