文档章节

mint-validate 轻量 验证工具包

水牛叔叔
 水牛叔叔
发布于 2014/11/22 00:36
字数 1580
阅读 764
收藏 40
点赞 2
评论 15

工具包的结构

本工具下载地址:http://git.oschina.net/895925636/mint-validate

收录地址:http://www.oschina.net/p/mint-validate

工具包中有4个主要类,他们是Valid, Verifiable, VerificationResult, Verifier。

Valid

Valid是注解,作用在bean类的字段上,用来配置验证的参数,一共四个参数:

  1. rule。字符串数组类型,配置自定义的验证器名,名字不分大小写
  2. pattern。字符串数组类型,配置用于验证字段的正则表达式
  3. tipMsg。字符串类型。配合正则表达式验证用,当正则验证不通过是,用于提示
  4. params。字符串数组类型。配合自定义验证器使用,自定义一些定义的参数传递到验证器内部

Verifiable

Verifiable是抽象类,需要验证的bean类必须继承该类。Verifiable有两个公共方法:

  1. public final boolean validate(String... fields)。验证bean的字段,当参数中不指定字段名字时,默认验证所有可验证字段(标注有Valid的字段)。如果所有规则都验证通过,返回true;有一个规则验证不通过都将返回false。
  2. public Set<VerificationResult> getValidateResult()。获取所有的验证结果。调用validate方法做验证时,所有的规则的验证结果都会封装成Verification保存在一个Set内。该方法可以获取这些结果

VerificationResult

VerificationResult封装验证结果。记录一个验证规则的5个验证信息:

  1. fieldName。String类型,被验证字段的字段名。
  2. fieldValue。Object类型。被验证字段的值。
  3. verifier。String类型。验证该字段对应的规则名。
  4. tipMsg。String类型。自定义的验证提示信息。
  5. result。boolean类型。验证结果true or false。

Verifier

Verifier是一个接口,所有自定义验证器都需要实现该接口,并且实现他唯一的方法:public VerificationResult verify(Object bean, Class<?> fieldType, Object fieldValue, String fieldName, String[] params)。verify 方法会被Verifiable 的 validate通过反射调用。该方法5个参数的含义如下:

  1. bean。被验证的bean对象。这在二维验证时用到,比如“字段1”和“字段2” 满足一定的关系才能通过验证的情况
  2. fieldType。被验证字段的java类型。
  3. fieldValue。被验证字段的值。
  4. fieldName。被验证字段的名字。
  5. params。验证时需要用到的一些参数。比如在验证密码长度时,不能小于6个字符,又不能多于32个字符,就可以通过params指定。

方法的返回值将参考VerificationResult,返回值会被Verifiable保存,并通过Verifiable的getValidateResult获得。

工具包的用法

先亮出demo中用到的两个bean,方便起见,不写getter 和 setter。

People继承Verifiable:

package test;

import mint.validate.Valid;
import mint.validate.Verifiable;

public class People extends Verifiable{
	public int gender;
	
	@Valid(rule="notnull")
	public String address;
}

User 继承 People:

package test;

import mint.validate.Valid;

public class User extends People{
	/*采用正则表达式验证(可配置多个正则表达式)*/
	@Valid(tipMsg="邮箱地址不正确", pattern={"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"})
	public String email;
	
	/*简单验证器验证*/
	@Valid(rule="notnull")
	public String username;
	
	/*采用验证器验证,并给验证器传递参数*/
	@Valid(rule={"LenLimit"}, params={"6", "32"})
	public String password;
}

正则表达式验证

正则表达式验证很简单。

只要在字段上做如下配置就行,tipMsg可以不配置,正则可以配置多个:

@Valid(tipMsg="邮箱地址不正确", pattern={"^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"})
public String email;

对象中调用validate方法就可以采用配置的正则去验证该字段了。

u.validate("email");

验证器验证

验证器验证的过程会复杂一些。一共分三步:定义验证器、注册验证器、使用验证器

定义验证器

验证器的定义需要遵循两个约定:

  1. 实现Verifier类
  2. 类名格式必须是:{验证器名字}+Verifier,验证器名字不区分大小写,比如 NotNullVerifier和NotnullVerifier是一样的。

看一个例子:

package verifiers;

import mint.validate.ValidateException;
import mint.validate.VerificationResult;
import mint.validate.Verifier;

public class LenLimitVerifier implements Verifier{
	@Override
	public VerificationResult verify(Object bean, Class<?> fieldType, Object fieldValue, String fieldName, String[] params) {
		if(fieldValue == null) return new VerificationResult(fieldName, "lenlimit", "字段值为空",	 null, false);
		
		if(params.length < 2){
			throw new ValidateException("没有指定合适参数");
		}
		
		int min, max;
		try{
			min = Integer.parseInt(params[0]); 
			max = Integer.parseInt(params[1]);
		} catch (NumberFormatException e){
			e.printStackTrace();
			throw new ValidateException("参数格式错误,无法转换成数字");
		}
		
		int len = ((String)fieldValue).length();
		if(len < min){
			return new VerificationResult(fieldName, "lenlimit", fieldName+"不能少于"+min+"个字符", fieldValue, false);
		}
		
		if(len > max){
			return new VerificationResult(fieldName, "lenlimit", fieldName+"不能多于"+max+"个字符", fieldValue, false);
		}
		return null;
	}
}
以上一个验证器的名字是LenLimit(使用时不区分大小写),用于验证一个String 字段的长度不能小于6字符而且不能大于32字符。

注册验证器

注册验证器需要在class目录下创建一个properties文件。如下图:

里面只写一个属性packages,属性值是自定义验证器所在的包,多个包用“;”(英文分号)隔开。like this:

packages=verifiers
这样验证工具在启动时就会自动去指定的包下扫描自定义验证器了。

使用验证器

这一步跟正则表达式的用法差不多,就在对应的字段上配置验证器:

/*采用验证器验证,并给验证器传递参数*/
@Valid(rule={"LenLimit"}, params={"6", "32"})
public String password;
因为LenLimitVerifier是验证长度限制的,所以用params配置两个表示长度限制的参数。

调用验证:

User u = new User();
u.password = "passw";
System.out.println(u.validate("password"));
for(VerificationResult r : u.getValidateResult()){
	System.out.println(r);
}

查看结果:

ps:自定义验证器灵活功能强,可以二维验证,可以结合数据库验证,反正逻辑随你写。

再写两个例子作为结束

验证父类中的字段。address字段在父类People中:

User u = new User();
u.address = "中国广东";
u.validate("address");
for(VerificationResult r : u.getValidateResult()){
    System.out.println(r);
}
验证所有配置了Valid注解的字段:
User u = new User();
		
u.email = "895925636#qq.com";
u.password = "passw";
u.address = "中国广东";

/*不写字段名*/
u.validate();
		
for(VerificationResult r : u.getValidateResult()){
	System.out.println(r);
}
欢迎讨论指正。。。

© 著作权归作者所有

共有 人打赏支持
水牛叔叔

水牛叔叔

粉丝 138
博文 72
码字总数 36149
作品 2
珠海
程序员
加载中

评论(15)

sp42
sp42
不错啊 有点像 Hibernate Validator,但 Hibernate Validator 十多兆。我用 Apache BVal,http://blog.csdn.net/zhangxin09/article/details/50600575。兼容 JSR 303 更好
水牛叔叔
水牛叔叔

引用来自“zmf”的评论

学习了,不过有个疑问:就是软引用那块好像有点问题,Map<String, SoftReference<Map<String, FieldInfo>>>这样申明觉得有个问题:1.就算软引用实例回收了,map对象的内存也没完全释放有点浪费,这样SoftReference<Map<String, Map<String, FieldInfo>>>是不是好点
2.虽然软引用实例Map<String, FieldInfo>内存回收了,但是软引用SoftReference可能还在,需要ReferenceQueue监听poll()删除该SoftReference.get()==null
哥们你说的那个问题真的存在,今天就出问题了,我还专程来看这个评论找解决方案。非常的感谢
水牛叔叔
水牛叔叔

引用来自“Kings__”的评论

还有一种情况,就是同样操作一个实体类,在2中不同的业务下,也许有些字段验证会不同,要是能解决这些细节就完美了,spring有专门的验证框架我用过,原理你和他的差不多。赞!
如果要根据业务的不同而区别验证规则,可以给自定义的规则传参数,这样可以一定程度解决这个问题。
开源中国首席脑科主任
开源中国首席脑科主任
还有一种情况,就是同样操作一个实体类,在2中不同的业务下,也许有些字段验证会不同,要是能解决这些细节就完美了,spring有专门的验证框架我用过,原理你和他的差不多。赞!
开源中国首席脑科主任
开源中国首席脑科主任
应该不支持国际化
开源中国首席脑科主任
开源中国首席脑科主任
应该不支持国际化
NewAE
NewAE
水牛 我感觉不错嘛..感觉挺灵活的..
水牛叔叔
水牛叔叔

引用来自“朱宏青”的评论

你可以看看JSR303
定义:javax.validation.*
实现:hibernate-validator-4.1.0.Final
资料:http://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/
非常好,我之前对这个了解不深,只是见别人用过。那个资料我看了,但是还是嫌这个规范的注解过多,不够灵活。欢迎探讨
朱宏青
朱宏青
你可以看看JSR303
定义:javax.validation.*
实现:hibernate-validator-4.1.0.Final
资料:http://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/
水牛叔叔
水牛叔叔
我的“<br/<”被吞了
验证工具包--mint-validate

mint-validate 是一个轻量的 验证工具包,不含源码的jar包 9.4k,含源码的jar包 15k,一共6个java文件,无第三方依赖。validate支持自定义验证规则,并用annotation配置验证规则。它的设计借...

水牛叔叔 ⋅ 2014/11/22 ⋅ 0

MinJieLiu/react-validate-framework

react-validate-framework 一个轻量、简单、易用的 表单验证组件 Demo: https://minjieliu.github.io/react-validate-framework 特性 轻量的体积 亲和的 API 内置常用验证方法 动态的验证 多...

MinJieLiu ⋅ 2017/01/02 ⋅ 0

MinJieLiu/validate-framework

#validate-framework 一款轻量、无依赖的 JavaScript 验证组件 Demo: http://minjieliu.github.io/validate-framework/example 特性 轻量、无依赖 相同 name 的表单验证 动态验证 兼容 chro...

MinJieLiu ⋅ 2016/06/10 ⋅ 0

基于 Vue.js 的移动端组件库--Mint UI

Mint-UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要。通过它,可以快速构建出风格统一的页面,提升开发效率。 真正意义上的按需加载组件。可以只加载声明过的组件及其样式文件...

匿名 ⋅ 2016/07/19 ⋅ 5

Data Pipeline

Data Pipeline 是一个Java的数据转换工具包,主要的功能包括: 读: CSV, fixed-width, Excel, database, weblogs, custom 写: CSV, fixed-width, Excel, database, PDF, Word, XML, custom 操......

匿名 ⋅ 2008/11/04 ⋅ 0

通用型的机器学习工具包--Sklearn-pandas

Sklearn-pandas既可以视为一个通用型的机器学习工具包,也可是视为一些特定算法的实现。它在具体的机器学习任务中主要充当支持者的角色。 这里所谓支持者的角色,按照其官网的解释即是说:S...

匿名 ⋅ 2017/02/22 ⋅ 0

如何在线升级Linux mint 14至最新版本的Linux mint 15

原文地址: How to Update / Upgrade from Linux Mint 14 Nadia to Linux Mint 15 Olivia 为了能得到正确的软件源,在命令行终端输入以下两行命令,把“quantal”替换成“raring”以及把“n...

knightuniverse ⋅ 2013/06/01 ⋅ 0

inhere/php-validate

php validate 一个简洁小巧且功能完善的php验证、过滤库。仅有几个文件,无依赖。 简单方便,支持添加自定义验证器 支持前置验证检查, 自定义如何判断非空 支持将规则按场景进行分组设置。或...

inhere ⋅ 2017/06/16 ⋅ 0

极验(Geetest) Laravel 5 集成开发包, 滑动二维码让验证更安全

简述 在网站开发中使用频率最高的工具之一便是验证码,验证码在此也是多种多样,不过简单的图片验证码已经可以被机器识别,极验验证码提供了一个安全可靠的滑动验证码体系,让网站开发更加安...

崔庆才 ⋅ 2016/07/26 ⋅ 0

Linux Mint 对 Meltdown 和 Spectre 安全漏洞的回应

Linux Mint 开发团队表示即将为所有受支持的版本推出安全修复补丁。 Linux Mint 开发团队今天发布了一个关于最近发现的 Meltdown 和 Specter 安全漏洞的声明,告知用户如何保证他们的 PC 安全...

局长 ⋅ 01/10 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Cube、Cuboid 和 Cube Segment

1.Cube (或Data Cube),即数据立方体,是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过 Cube 对数据进行分析,可以大大加快数据的查询效率 2.Cuboid 在 Kylin 中特...

无精疯 ⋅ 39分钟前 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 40分钟前 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 51分钟前 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 53分钟前 ⋅ 0

我的第一篇个人博客

虽然这是个技术博客,但是,我总是想写一些自己的东西,所有就大胆的在这里写下了第一篇非技术博客。技术博客也很久没有更新,个人原因。 以后自己打算在这里写一些非技术博客,可能个人观点...

Mrs_CoCo ⋅ 54分钟前 ⋅ 0

Redis 注册为 Windows 服务

Redis 注册为 Windows 服务 redis 注册为 windows 服务相关命令 注册服务 redis-server.exe –service-install redis.windows.conf 删除服务 redis-server –service-uninstall 启动服务 re......

Os_yxguang ⋅ 54分钟前 ⋅ 0

世界那么大,语言那么多,为什么选择Micropython,它的优势在哪?

最近国内MicroPython风靡程序界,是什么原因导致它这么火呢?是因为他功能强大,遵循Mit协议开源么? 错!因为使用它真的是太舒服了!!! Micropython的由来,这得益于Damien George这位伟大...

bodasisiter ⋅ 58分钟前 ⋅ 0

docker 清理总结

杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器(docker rm没有加-f参数,运行中的容器不会删掉) docker rm $(docker ps -a -q) 删除所有未打 dangling 标...

vvx1024 ⋅ 今天 ⋅ 0

关于学习

以前学车的时候,教练说了这样的一句话:如果一个人坐在车上一直学,一直学,反而不如大家轮流着学。因为一个人一直学,就没有给自己留空间来反思和改进。而轮流着学的时候大家下来之后思考上...

mskk ⋅ 今天 ⋅ 0

压缩工具之gzip-bzip2-xz

win下常见压缩工具:rar zip 7z linux下常见压缩工具:zip gz bz2 xz tar.gz tar.bz2 tar.xz gzip 不支持目录压缩 gzip 1.txt #压缩。执行后1.txt消失,生成1.txt.gz压缩文件 gzip -d 1.txt....

ZHENG-JY ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部