【开源】EValidator Java校验工具包

目录

背景


开发背景

来源:在之前公司导入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);
                }
...........

看了这段代码,我在想能不能把这部分的代码抽成一个公共的校验类,在下次开发同样的功能时,就可以直接用了。并且代码也不会这么写了,说干就干

工具引入

Maven

<dependency>
  <groupId>com.gitee.dqhm</groupId>
  <artifactId>evalidator</artifactId>
  <version>1.0.4</version>
</dependency>

Grade

implementation 'com.gitee.dqhm:evalidator:1.0.4'

最新版本查看地址:Maven Central Repository Search

开源地址

EValidator: 字段校验

使用说明

简单校验

在需要校验的字段上加上注解 

    @Evalidator(rules = Ev.REQUIRED)

rules 为执行的校验类,可以在Ev.java 类中查看目前已实现的,多个校验规则,则用{”“,""}隔开即可

demo

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;

    /**
     * 自定义异常校验
     * otherRules 为自己定义的类路径,实现校验的方法
     */
    @Evalidator(otherRules = "eample.rules.MyselfRule",errorMsg = "自定义异常校验")
    private String selfValidator;

    /**
     * 字符串格式化处理,如 过滤字符串中特殊字符
     * filter 过滤规则,为类路径
     */
    @Evalidator(filter = Filter.DIGITAL_FILTER)
    private String filter;
}

配置完成后,在代码中添加执行语句,错误信息将会返回一个List<String>类型,校验会全部校验完成后统一返回所有校验不通过提示信息,如:

        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);

自定义校验规则

毕竟一个人应对的校验规则有限,所以要是我代码中提供的校验不能满足你需要的,你可以自定义校验规则,具体操作:

编写校验类继承我的校验类,如:

package eample.rules;

import com.ev.rules.verification.Verification;
import eample.errormsg.MyselfError;

/**
 * @description: 自定义校验规则类
 */
public class MyselfRule extends Verification {
    //入参为注解了字段的值
    @Override
    public String execute(Object value) {
        return "自定义校验异常";
    }
}

返回校验失败提示即可,同时在字段注解上校验规则那里,规则填 otherRules,value为你创建类的类路径

    @Evalidator(otherRules = "eample.rules.MyselfRule")

自定义过滤规则

当我们想对输入的数据进行一定的处理,如,过滤空格,特殊字符,只保留数字等等,我们可以配置如下

package com.ev.filter.rule;

import com.ev.filter.FilterRule;
import com.ev.util.NumberUtil;
import com.ev.util.StringUtils;

/**
 * 过滤非数字字符
 */
public class DigitalFilter implements FilterRule {

    @Override
    public Object filter(Object value) {
        if (StringUtils.isEmpty(value)) {
            return value;
        }

        if (value instanceof String) {
            if (NumberUtil.isNumber(value.toString())) {
                return value;
            }
            return value.toString().replaceAll("[^0-9]", "");
        }
        return value;
    }
}

然后,在实体类中配置 

@Evalidator(filter = Filter.DIGITAL_FILTER)

public static final String DIGITAL_FILTER = "com.ev.filter.rule.DigitalFilter";

值为类的路径,这样,后面只要配置了,就会进行数据过滤,清洗

附言

具体的校验可以查看开源项目中的Eample,里面有各种校验的简单测试方法

写的不好的地方大家可以评论留言,看到了都会认真对待的!同时大家有新的校验也可以push上来,使得校验更简单,嘿嘿

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天空~华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值