目录
来源:在之前公司导入Excel的数据校验是这样的
-
- ......
- if (!StrUtil.isBlank(phone) && !StringUtils.isNumber(phone)) {
- String errorMsg = "xxx格式错误";
- failList.add(errorMsg);
- }
- if (!StrUtil.isBlank(phoneBack) && !StringUtils.isNumber(phoneBack)) {
- String errorMsg = "xxx格式错误";
- failList.add(errorMsg);
- }
- if (!StrUtil.isBlank(email) && existEmailList.contains(email)) {
- String errorMsg = "xx已存在";
- failList.add(errorMsg);
- }
-
- if (StrUtil.isNotBlank(customerTypeDesc)) {
- String errorMsg = "xxx必填";
- failList.add(errorMsg);
- }
- ...........
相信大部分公司,比如导入一个Excel,需要校验列的值,用的都是上面的方式进行校验,本工具的目的是为了解决这一系列的代码,使得校验越来越简洁。
Maven
- <dependency>
- <groupId>com.gitee.dqhmgroupId>
- <artifactId>evalidatorartifactId>
- <version>2.0.1version>
- dependency>
Grade
implementation 'com.gitee.dqhm:evalidator:2.0.1'
最新版本查看地址:Maven Central Repository Search
在需要校验的字段上加上注解
@Evalidator(rules = Ev.REQUIRED)
rules 为工具自带的校验, 多种校验,则用{”“,""}隔开即可,目前自带的校验有
- public enum Ev {
- DATE_DOWN("验证时间不得早于指定时间(默认为当前时间)", "dateCompareDownVerification"),
- DATE_UP("验证时间不得迟于指定时间(默认为当前时间)", "dateCompareUpVerification"),
- DATE_FORMAT("验证日期格式是否正确", "dateFormatVerification"),
- ANY_REQUIRED("验证多个字段任一必填", "anyRequiredVerification"),
- SCOPE("验证值是否在范围中", "scopeVerification"),
- REQUIRED("验证必填", "requiredVerification"),
- DIGITAL("验证是否为数字", "digitalVerification"),
- LENGTH("验证长度是否在允许范围", "lengthVerification"),
- USER_NAME("验证用户名(字母开头,允许5-16字节,允许字母数字下划线)", "userNameVerification"),
- PASSWORD("验证密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)", "passwordVerification"),
- MOBILE("验证手机号", "mobileVerification"),
- EMAIL("验证邮箱格式是否正确", "emailVerification"),
- CHINESE("验证是否包含汉字", "chineseVerification"),
- ID_CARD("验证身份证(15位、18位数字)", "idCardVerification"),
- URL("验证URL是否正确", "urlVerification"),
- IP_ADDR("验证IP地址是否正确(x.x.x.x)", "ipAddrVerification");
-
- }
使用方式,在需要校验的实体类字段上,加上注解 @Evalidator
- package eample.model;
-
- import com.ev.annotation.Evalidator;
- import com.ev.com.ev.consts.DateFomat;
- import com.ev.com.ev.consts.Ev;
- import com.ev.com.ev.consts.Filter;
- import lombok.Data;
-
- /**
- * 测试实体类
- *
- * @author dengqianghua
- * @date 2021/8/9 16:40
- */
- @Data
- public class TestModel {
- /**
- * 时间大小比较
- * dateFormat 数据输入的日期格式
- * specifiedTime 进行比较的时间 默认为当前时间
- */
- @Evalidator(rules = Ev.DATE_DOWN,dateFormat = DateFomat.DF_01,specifiedTime = 1628498819000L,name = "测试时间小于指定时间")
- private String dateCompareDown;
- /**
- * 时间大小比较
- */
- @Evalidator(rules = Ev.DATE_UP,dateFormat = DateFomat.DF_01,specifiedTime = 1628498819000L,name = "测试时间大于指定时间")
- private String dateCompareUp;
- /**
- * 日期格式
- * dateFormat 期望的日期格式
- */
- @Evalidator(rules = Ev.DATE_FORMAT,dateFormat = DateFomat.DF_31,name = "测试日期")
- private String dateFormat;
- /**
- * 任一必填
- * anyRequired 为需要进行任一必填的类型,类型一致才会进行任一必填校验
- */
- @Evalidator(rules = Ev.ANY_REQUIRED,anyRequired = "c")
- private String anyRequired;
-
- /**
- * 任一必填
- */
- @Evalidator(rules = Ev.ANY_REQUIRED,anyRequired = "c")
- private String anyRequired2;
-
- /**
- * 必填
- */
- @Evalidator(rules = Ev.REQUIRED)
- private String required;
- /**
- * 数字
- */
- @Evalidator(rules = Ev.DIGITAL,name = "测试数字",errorMsg = "格式出错")
- private String digital;
- /**
- * 长度
- */
- @Evalidator(rules = Ev.LENGTH,maxLength = 10)
- private String length;
- /**
- * 用户名
- */
- @Evalidator(rules = Ev.USER_NAME)
- private String userName;
-
- /**
- * 密码
- */
- @Evalidator(rules = Ev.PASSWORD)
- private String password;
-
- /**
- * 手机号
- */
- @Evalidator(rules = Ev.MOBILE)
- private String mobile;
-
- /**
- * 邮箱
- */
- @Evalidator(rules = Ev.EMAIL)
- private String email;
-
- /**
- * 汉字
- */
- @Evalidator(rules = Ev.CHINESE)
- private String chinese;
-
- /**
- * 身份证
- */
- @Evalidator(rules = Ev.ID_CARD)
- private String idCard;
-
- /**
- * URL
- */
- @Evalidator(rules = Ev.URL)
- private String url;
-
- /**
- * IP地址
- */
- @Evalidator(rules = Ev.IP_ADDR)
- private String ipAddr;
- /**
- * 不在范围内
- * values 允许的范围
- */
- @Evalidator(rules = Ev.SCOPE,values = {"caw","8965"})
- private String scope;
-
- /**
- * 字符串格式化处理,如 过滤字符串中特殊字符
- * filter 过滤规则,为类路径
- */
- @Evalidator(filter = Filter.DIGITAL_FILTER)
- private String filter;
- }
配置完成后,在代码中添加执行语句,错误信息将会返回一个List
- TestModel testModel = new TestModel();
- testModel.setAnyRequired("test1");
- testModel.setRequired("99998");
- testModel.setDateCompareDown("2021-09-05");
- testModel.setDateCompareUp("2020-09-05");
- EvalidatorFactory.evalidator(testModel).forEach(System.out::println);
至此,校验就完成了
错误提示分为在当前实体返回的错误提示,和所有用到这个校验规则的错误提示
当前实体的错误提示:只需要在字段上面注解中添加一个属性 errorMsg 如:
@Evalidator(rules = Ev.USER_NAME,name = "用户名",errorMsg = "校验不通过")
name 为提示前缀,所以校验不通过会提示:用户名校验不通过,当然也可以不用name,直接写errorMsg就好,name主要用于所有校验规则提示的前缀区分
所有校验规则提示:意思是只要rules里面填了校验规则,并且没有填errorMsg,则默认会输出类ErrorMsg.java 中定义的默认提示,如果想要更改默认的校验规则提示,只需要更改ErrorMsg.java里面的错误定义,如:
- package eample.errormsg;
-
- import com.ev.com.ev.consts.ErrorMsg;
-
- /**
- * @description: 错误提示重写类
- */
- public class MyselfError extends ErrorMsg {
-
- {
- super.requiredMsg = "必填";
- super.anyRequired = "必须填一个";
- }
-
- }
然后在执行的时候,把自己定义的错误异常类,作为入参传入即可,这种提示适合统一校验的提示
- ErrorMsg errorMsg = new MyselfError();
- TestModel testModel = new TestModel();
- EvalidatorFactory.evalidator(testModel, errorMsg).forEach(System.out::println);
毕竟默认的校验规则有限,所以要是我代码中提供的校验不能满足你需要的,你可以自定义校验规则,具体操作:在你写的校验方法上,添加注解 @EvalidatorMethod
- package eample.rules;
-
- import com.ev.annotation.EvalidatorMethod;
- import com.ev.com.ev.consts.Param;
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * @author dengqianghua
- * @description: 自定义校验规则类
- * @date 2021/5/14 14:42
- */
- public class MyselfRule {
-
- @EvalidatorMethod(param = Param.ALL)
- public List
myselfRule(Object value) { - System.out.println(value);
- List
errorMage = new ArrayList<>(); - errorMage.add("测试提示信息");
- errorMage.add("wwwwee");
-
- return errorMage;
- }
- }
param参数为,入参的形式
- public enum Param {
- ALL("ALL", "整个对象"),
- VALUE("VALUE", "单个字段值"),
- }
校验方法的出参,可以为一条校验不通过的提示信息,也可以为多条,多条则为List类型即可,配置好后,就可以按如下方式使用,实体类中字段增加如下注解,方法名,可以自己编写一个常量保存;
- /**
- * 自定义异常校验
- * otherRules 为自己定义的类路径,实现校验的方法
- */
- @Evalidator(otherRules = "myselfRule")
- private String selfValidator;
执行: EvalidatorFactory.loading("eample.rules"); 为自定义方法所在包路径,多个用数组即可
- EvalidatorFactory.loading("eample.rules");
- TestModel testModel = new TestModel();
- EvalidatorFactory.evalidator(testModel).forEach(System.out::println);
具体的校验可以查看开源项目中的Eample,里面有各种校验的简单测试方法
写的不好的地方大家可以评论留言,看到了都会认真对待的!同时大家有新的校验也可以push上来,使得校验更简单,嘿嘿