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种状态: ...
随机推荐
- [Arduino] 在串口读取多个字符串,并且转换为数字数组
功能如题目.在串口收到逗号分割的6串数字比如100,200,45,4,87,99然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值代码注释很详细了,就不再说明了. //定义一个c ...
- 3. Android框架和工具之 xUtils(DbUtils )
1. xUtils简介 xUtils 包含了很多实用的android工具.xUtils 最初源于Afinal框架,进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持(10种谓 ...
- Java中transient有何作用?
transient关键字用来防止序列化域.如果一个引用类型被transient修饰,则其反序列化的结果是null.基本类型则为0.如果引用类型时不可序列化的类,则也应该使用transient修饰,它在 ...
- mina 字节数组编解码器的写法 II
I 里面的写法不够严谨,这也是我之前说它简陋的主要原因,下面来个更加严谨.完整一点儿的: ByteArrayEncoder.java package org.bruce.mina.cpp.codec; ...
- Shuffle an Array
class Solution { private: vector<int> arr, idx; public: Solution(vector<int> nums) { sra ...
- ES6:JavaScript 新特性
我相信,在ECMAScript.next到来的时候,我们现在每天都在写的JavaScript代码将会发生巨大的变化.接下来的一年将会是令JavaScript开发者们兴奋的一年,越来越多的特性提案将被最 ...
- 说说C#和.NET的关系
.NET和C#的关系:C#语言可以通过.NET平台编写.部署.运行.NET应用程序..NET可以支持包括C#在内的多种语言编写的应用程序..NET平台主要包括FCL(框架类库)它是微软事先定义好的类的 ...
- SQL Server 2012入门图解:建表、备份、还原
一.建立你的第一个数据库和表 例:建立一个用于描述一个学校学生情况的数据库.把它命名为School.并且要在School数据库下建立保存学生信息的表Student.在可视化界面下,我们通常这样操作 ...
- part 3 Controllers in AngularJS
What happens if the controller name is misspelled? When the controller name is misspelled, 2 things ...
- 将java项目打包成jar文件并在cmd运行
保证java项目不报错能够通过运行 选择export 选择一个你要运行的程序入口Main方法 打开cmd,前提是你的javajdk及环境变量配置完成