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种状态: ...
随机推荐
- oc中的block
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- OC之category的用法
简介 实例 好处 一.category简介 动态的为某个已经存在的类增加方法,不可以增加成员变量 二.实例 // // Student+CatetoryStudent.h // Category // ...
- 重构24-Remove Arrowhead Antipattern(去掉箭头反模式)
基于c2的wiki条目.Los Techies的Chris Missal同样也些了一篇关于反模式的post. 简单地说,当你使用大量的嵌套条件判断时,形成了箭头型的代码,这就是箭头反模式(arrow ...
- 使用subversion搭建SVN
使用subversion搭建SVN需要用到的软件包有subversion,apr,apr-util,sqlite,zlib,因为在编译安装subversion时需要指明apr.apr-util.sql ...
- ionic 项目的启动屏幕
首先要做好图片,图片的大小最好是192px*192px(icon.png).2208px*2208px(splash.png); 然后在APP项目中建立一个新文件夹,resources,将准备好的两张 ...
- jQuery选择器之属性选择器Demo
测试代码: 06-属性选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- Service Discovery with Apache Curator
Curator的介绍 Curator就是Zookeeper的一个客户端工具(不知道Zookeeper的同学可以到http://www.ibm.com/developerworks/cn/opensou ...
- Android achartengine统计图
最近在安卓2.2上写个实时的监控程序,要用到统计图.从网上搜了下 Java4Less (http://java4less.com/charts/chart.php?info=android) ...
- Table of Contents - TCP/IP
网络访问层 Ethernet II 网际层 IP IPv4 报文格式 ICMP ICMP 报文分析 ping: 向网络主机发送 ICMP ECHO_REQUEST 包 ARP ARP 过程 arp 命 ...
- android APP是否需要缓存?+简单架构
问题的由来 昨天,当我写完我的第一篇博客之后,我便百无聊赖的玩起了手机!当我打开Google自带的一些app的时候,发现他们直接叫我连接网络,并没有缓存上次从网络获取的数据.这就让我感到很奇怪!于是我 ...