这是一个验证框架,并且是一个 独立的验证框架 ,不依赖与其他已有的框架;
可以自由的嵌入到其他框架,比如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,如需转载请自行联系原作者