博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mint-validate 轻量 验证工具包
阅读量:6381 次
发布时间:2019-06-23

本文共 4361 字,大约阅读时间需要 14 分钟。

  hot3.png

工具包的结构

本工具下载地址:

收录地址:

工具包中有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);}
欢迎讨论指正。。。

转载于:https://my.oschina.net/cnlw/blog/347369

你可能感兴趣的文章
让你的PHP程序真正的实现多线程(PHP多线程类)(转)
查看>>
Java JDBC 基础知识
查看>>
search-a-2d-matrix——二维矩阵找数
查看>>
lua基础【三】唯一数据结构table表
查看>>
Web应用安全审计工具WATOBO
查看>>
CSS3_animation笔记
查看>>
Android Google 地图 API for Android
查看>>
从 Zero 到 Hero ,一文掌握 Python--转
查看>>
【软件下载】整理一些外国的工具软件下载到网盘方便国内使用
查看>>
idea项目左边栏只能看到文件看不到项目结构
查看>>
idea如何编译maven项目
查看>>
在centos7下安装svn
查看>>
删除软链接
查看>>
windows7下MSN如何最小化到任务栏
查看>>
HDU-3016 Man Down 线段树
查看>>
初步认识注册表(待续)
查看>>
只能输入数字的TextBox自定义控件
查看>>
自定义事件
查看>>
浮点数的二进制
查看>>
主库配置关于Dataguard Online redo log 和 Standby redo log
查看>>