Jiang LiHeng Good is good, but better carries it.

Java 常用验证方法(commons-validator,hutool)

2020-08-29
jiangliheng
本文 4925 字,阅读全文约需 15 分钟

背景

为了实现接口响应全量字段断言,开发断言表达式框架时,除了调研常用的断言框架之外,也调研了一些验证框架和方法(非hibernate-validatorspring-validator验证注解)。

简单学习下构建工具Gradle如何使用。

commons-validator

A common issue when receiving data either electronically or from user input is verifying the integrity of the data. This work is repetitive and becomes even more complicated when different sets of validation rules need to be applied to the same set of data based on locale. Error messages may also vary by locale. This package addresses some of these issues to speed development and maintenance of validation rules.

Apache开源的通用验证框架,目前最新版本1.7

hutool

A set of tools that keep Java sweet.

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool 是项目中 “util” 包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的 bug。

验证方法比较

仅仅从验证方法比较:

  • commons-validator除了通用验证方法外,还支持国际通用数字标准验证,比如:IBAN (International Bank Account Number)ISSN(International Standard Serial Number)ISBN(International Standard Book Number)
  • hutool(Validator)通用验证方法与commons-validator基本一致,由于国人开源,验证方法较“中国”化些,比如:身份证、手机号、车牌号、邮政编码、社会统一信用代码、是否汉字等。

PS:hutool作者问题交流和合并 PR 那是极快的。

验证测试工程(基于Gradle)

Gradle 配置文件

plugins {
    id 'java'
}

group 'com.jlh'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.testng:testng:6.14.3'
    compile 'commons-validator:commons-validator:1.7'
    compile 'cn.hutool:hutool-all:5.4.0'
}

验证方法使用演示

package com.jlh.validator;

import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.IdcardUtil;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.routines.InetAddressValidator;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.util.UUID;

/**
 * 验证框架测试
 *
 * @Author:jiangliheng
 * @Date:2020/8/28 13:31
 */
public class ValidatorTest {

    /**
     * apache commons validator 使用演示
     */
    @Test
    public void commonsValidatorTest() {
        // null 或 空断言
        Assert.assertTrue(GenericValidator.isBlankOrNull(""));
        Assert.assertTrue(GenericValidator.isBlankOrNull(null));
        // int,其他类型一样:byte,short,float,double,long
        Assert.assertTrue(GenericValidator.isInt("1"));
        // 日期
        Assert.assertTrue(GenericValidator.isDate("20200829", "yyyyMMdd",true));
        // int 在指定范围内,其他类型一样:byte,short,float,double,long
        Assert.assertTrue(GenericValidator.isInRange(1, 0,2));
        // int 最大最小,其他类型一样:float,double,long
        Assert.assertTrue(GenericValidator.minValue(1, 1));
        Assert.assertTrue(GenericValidator.maxValue(1, 1));
        // 字符串 最大最小长度
        Assert.assertTrue(GenericValidator.maxLength("daodaotest", 10));
        Assert.assertTrue(GenericValidator.minLength("daodaotest", 10));
        // 正则表达式
        Assert.assertTrue(GenericValidator.matchRegexp("daodaotest", "^d.*t$"));
        // 信用卡验证
        Assert.assertTrue(GenericValidator.isCreditCard("6227612145830440"));
        // url
        Assert.assertTrue(GenericValidator.isUrl("http://www.baidu.com"));
        // email
        Assert.assertTrue(GenericValidator.isEmail("dao@test.com"));
        // ip
        Assert.assertTrue(InetAddressValidator.getInstance().isValid("192.168.1.1"));
        Assert.assertTrue(InetAddressValidator.getInstance().isValid("CDCD:910A:2222:5498:8475:1111:3900:2020"));
    }

    /**
     * hutools validator 使用演示
     */
    @Test
    public void huTollsValidatorTest() {
        // null 空 布尔
        Assert.assertTrue(Validator.isNull(null));
        Assert.assertTrue(Validator.isNotNull("daodaotest"));
        Assert.assertTrue(Validator.isEmpty(""));
        Assert.assertTrue(Validator.isNotEmpty("daodaotest"));
        Assert.assertTrue(Validator.isTrue(true));
        Assert.assertTrue(Validator.isFalse(false));
        // 相等
        Assert.assertTrue(Validator.equal("daodaotest","daodaotest"));
        // 是否汉字,包含汉字
        Assert.assertTrue(Validator.hasChinese("daodaotest叨叨软件测试"));
        Assert.assertTrue(Validator.isChinese("叨叨软件测试"));
        // 是否为数字
        Assert.assertTrue(Validator.isNumber("1.1"));
        // 是否字母,包括大写和小写字母
        Assert.assertTrue(Validator.isWord("daodaotest"));
        // 是否为英文字母 、数字和下划线, 还支持:大写和小写字母和汉字(isLetter)
        Assert.assertTrue(Validator.isGeneral("dao_1"));
        // 是否全为大写或小写字母
        Assert.assertTrue(Validator.isLowerCase("daodaotest"));
        Assert.assertTrue(Validator.isUpperCase("DAODAOTEST"));
        // 检查给定的数字是否在指定范围内
        Assert.assertTrue(Validator.isBetween(1,1,1));
        // 生日
        Assert.assertTrue(Validator.isBirthday("20200830"));
        // 18位 身份证号格式校验,已经提 PR,改为调用 IdcardUtil 的方法,估计5.4.1 版本更新
        Assert.assertTrue(Validator.isCitizenId("11010119900307299X"));
        // 身份证校验,支持18位、15位和港澳台的10位
        // 支持:10位(isValidCard10),15位(isValidCard15),18位(isValidCard18),香港(isValidHKCard),台湾(isValidTWCard)
        Assert.assertTrue(IdcardUtil.isValidCard("11010119900307299X"));
        Assert.assertTrue(IdcardUtil.isValidCard18("11010119900307299X"));
        // 统一社会信用代码(营业执照注册号)
        Assert.assertTrue(Validator.isCreditCode("91350500676532779B"));
        // 中国车牌号
        Assert.assertTrue(Validator.isPlateNumber("京A88888"));
        // 邮编
        Assert.assertTrue(Validator.isZipCode("100000"));
        // uuid
        Assert.assertTrue(Validator.isUUID(UUID.randomUUID().toString()));
        // 正则表达式
        Assert.assertTrue(Validator.isMatchRegex("^d.*t$","daodaotest"));
        // 手机号
        Assert.assertTrue(Validator.isMobile("13888888888"));
        // url
        Assert.assertTrue(Validator.isUrl("http://www.baidu.com"));
        // email
        Assert.assertTrue(Validator.isEmail("dao@test.com"));
        // ip
        Assert.assertTrue(Validator.isIpv4("192.168.1.1"));
        Assert.assertTrue(Validator.isIpv6("CDCD:910A:2222:5498:8475:1111:3900:2020"));
    }

}

微信公众号:daodaotest


作者:Jiang LiHeng
原文链接:https://jiangliheng.github.io/2020/08/29/java-validator/
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。


上一篇 Linux 日常操作

Comments

Content