Java对象校验框架之Oval
只要有接口,就会有参数的校验,目前开源的校验框架已经非常多了,不过不得不提一下Oval。
OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件、Annotation、POJOs 进行设定。可以使用纯 Java 语言、JavaScript 、Groovy 、BeanShell 等进行规则的编写。
使用起来也非常简单
public class OvalTest {
@Min(20)
private int age;
@Length(min = 6, max = 10)
private String name;
public static void main(String[] args) {
OvalTest ovalTest = new OvalTest();
ovalTest.age = 10;
ovalTest.name = "kolor";
Validator validator = new Validator();
List<ConstraintViolation> ret = validator.validate(ovalTest);
System.out.println(ret);
}
}
<p><?xml version="1.0" encoding="UTF-8"?>
<!--
<!DOCTYPE oval PUBLIC
"-//OVal/OVal Configuration DTD 1.3//EN"
"<a href="http://oval.sourceforge.net/oval-configuration-1.3.dtd">http://oval.sourceforge.net/oval-configuration-1.3.dtd</a>">
-->
<oval xmlns="<a href="http://oval.sf.net/oval-configuration">http://oval.sf.net/oval-configuration</a>" xmlns:xsi="<a href="http://http://www.w3.org/2001/XMLSchema-instance">http://http://www.w3.org/2001/XMLSchema-instance</a>"
xsi:schemaLocation="<a href="http://oval.sf.net/oval-configuration">http://oval.sf.net/oval-configuration</a> ../../../../../../../../main/resources/net/sf/oval/configuration/xml/oval-configuration.xsd"
>
<!-- define a constraint set -->
<!--<constraintSet id="user.userid">
<notNull message="{context} is null" />
<matchPattern message="{context} does not match the pattern {pattern}">
<pattern pattern="<a href="file://\\d{15}|\\d{17}+[\\dX">\\d{15}|\\d{17}+[\\dX</a>]" flags="0" />
</matchPattern>
</constraintSet>--></p><p> <class type="com.haove.oval.TrainData" overwrite="false" applyFieldConstraintsToSetters="false">
<field name="sfzh">
<matchPattern message="身份证号不符合规则">
<pattern pattern="[0-9]{15}|[0-9]{17}[0-9X]" flags="0" />
</matchPattern>
</field>
<field name="xm">
<length min="1" max="24" message="姓名为 {min} 至 {max}个字符" />
<validateWithMethod methodName="isValid" parameterType="java.lang.String" message="姓名与学籍库不一致"/>
</field>
<field name="qjStart">
<length min="1" message="区间起点不能少于{min}个字符" />
</field>
<field name="qjEnd" overwrite="true">
<length min="1" message="区间终点不能少于{min}个字符" />
</field></p><p> <field name="rxrq">
<matchPattern message="入学日期为8位数字">
<pattern pattern="[0-9]{8}"/>
</matchPattern>
</field>
<field name="yhcs">
<matchPattern message="优惠次数为一位或两位数字">
<pattern pattern="[0-9]{1,2}" flags="0" />
</matchPattern>
</field>
<field name="kxlh">
<length min="1" message="卡序列号不能少于{min}个字符" />
</field>
</class>
</oval></p>
这个xml里包含了<notNull />,<notBlank />,<validateWithMethod />,<dateRange />,<pattern />等几种校验,比较有特点的是可以自定义方法校验validateWithMethod,有了这个就可以将校验扩展的更加强大,比如说可以将数据跟数据库里的数据进行比较校验。还有其他校验,可以参考源码,或问我。
另外,经查源码,发现方法public List<ConstraintViolation> validateFieldValue(final Object validatedObject, final Field validatedField, final Object fieldValueToValidate)可以只校验自己想校验的field,不会校验全部field,这个在有些时候还是蛮有用的。
另外附上,使用xml校验的java源码例子:
import java.lang.reflect.Field;
import java.util.List; import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import net.sf.oval.configuration.xml.XMLConfigurer; public class TrainData {
private String xm;
private String sfzh;
private String qjStart;
private String qjEnd;
private String rxrq;
// @ValidateWithMethod(methodName = "isValid", parameterType = String.class)
private String yhcs;
private String kxlh;
public TrainData(){}
public TrainData(String xm, String sfzh, String qjStart, String qjEnd, String rxrq, String yhcs, String kxlh){
this.xm = xm;
this.sfzh = sfzh;
this.qjStart = qjStart;
this.qjEnd = qjEnd;
this.rxrq = rxrq;
this.yhcs = yhcs;
this.kxlh = kxlh;
}
private boolean isValid(String xm) {
//to do 数据库根据身份证号查询出的姓名进行比较
if("1".equals(xm))
return true;
return false;
}
public static void main(String[] args) {
try{
TrainData data = new TrainData("刘艳梅","11010619770201304","","","20050101","2","123");
XMLConfigurer x2 = new XMLConfigurer();
x2.fromXML(XMLConfigurationTest.class.getResourceAsStream("TrainDataValidation.xml"));
Validator validator = new Validator(x2);
// Validator validator = new Validator();
// Field f=TrainData.class.getDeclaredField("xm");
// List<ConstraintViolation> violations = validator.validateFieldValue(new TrainData(), f, "12");
List<ConstraintViolation> violations = validator.validate(data);
for(ConstraintViolation var:violations){
System.out.println(var.getMessage());
}
}catch(Exception ex){ }
}
}
Java对象校验框架之Oval的更多相关文章
- Java 简单校验框架
数据校验框架现状 在我们的方法入口后面,难免会有如下样子的代码: result.setSuccess(false); if (StringUtils.isBlank(bizOrder.getThird ...
- Dubbo的Filter实战--整合Oval校验框架
前言: 其实很早之前就想写一篇关于oval和具体服务相整合的常见做法, 并以此作为一篇笔记. 趁现在项目中间空闲期, 刚好对dubbo的filter有一些了解. 因此想结合两者, 写一下既结合校验框架 ...
- 自己写的基于java Annotation(注解)的数据校验框架
JavaEE6中提供了基于java Annotation(注解)的Bean校验框架,Hibernate也有类似的基于Annotation的数据校验功能,我在工作中,产品也经常需要使 用数据校验,为了方 ...
- Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mengzhengbin520.blog.51cto.com/7590564/12 ...
- (转)Hibernate框架基础——Java对象持久化概述
http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构 说明 ...
- xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml
xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...
- JSON-lib框架,JAVA对象与JSON、XML之间的相互转换
Json-lib可以将Java对象转成json格式的字符串,也可以将Java对象转换成xml格式的文档,同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象. 一. 准备工作 ...
- 测试json字符和java对象属性不一样在多个json框架下转换的表现
package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...
- (转)Hibernate框架基础——在Hibernate中java对象的状态
http://blog.csdn.net/yerenyuan_pku/article/details/52760627 在Hibernate中java对象的状态 Hibernate把对象分为4种状态: ...
随机推荐
- iOS 手机 邮箱 正则表达式
//iOS代码//判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex ...
- Remap BMW F11 2010 all ECUs with E-Sys and ENET cable
Just wanted to share some experiences remaping all the ECUs in my F11 2010 BMW, hopefully other BMW ...
- 为Web Api 2认证服务器增加令牌刷新功能
Refresh tokens can potentially improve the situation but also increase complexity. A refresh token i ...
- Emacs golang 配置
在配置前需要下载用到的包: godoc godef gocode oracle 在下载包之前需要设置好环境变量: # Golang export GOROOT=$HOME/go export GOPA ...
- 每天一个Linux命令(1):ls命令
转自http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html ls命令是Linux下最常用的命令.ls命令就是list的缩写,缺省下ls ...
- LeetCode 287
Find the Duplicate Number Given an array nums containing n + 1 integers where each integer is betwee ...
- 转: 微博的多机房部署的实践(from infoq)
转: http://www.infoq.com/cn/articles/weibo-multi-idc-architecture 在国内网络环境下,单机房的可靠性无法满足大型互联网服务的要求,如机房 ...
- freemarker编辑器eclipse插件
freemarker编辑器eclipse插件 支持语法高亮,语法校验,代码提示的工具 freemarker IDE(JBoss): http://download.jboss.org/jbossto ...
- Session,Cookie,jsessionid,Url重写
在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中也有类似的情况,这时候我们通常会使用COOKIE来实现,例如如下的代码: < % cookie[]cookies ...
- asp.net中用正则表达式验证数据格式
这是一个验证是否为数字的例子: Regex reg = new Regex(@"^[0-9]+\.{0,1}[0-9]*$");reg.IsMatch(textBox1.T ...