Java 常用驗(yàn)證方法(commons-validator,hutool)

背景

為了實(shí)現(xiàn)接口響應(yīng)全量字段斷言,開發(fā)斷言表達(dá)式框架時,除了調(diào)研常用的斷言框架之外,也調(diào)研了一些驗(yàn)證框架和方法(非hibernate-validator、spring-validator驗(yàn)證注解)。

簡單學(xué)習(xí)下構(gòu)建工具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開源的通用驗(yàn)證框架,目前最新版本1.7。

hutool

A set of tools that keep Java sweet.

Hutool是一個小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,使Java擁有函數(shù)式語言般的優(yōu)雅,讓Java語言也可以“甜甜的”。

Hutool 是項(xiàng)目中 “util” 包友好的替代,它節(jié)省了開發(fā)人員對項(xiàng)目中公用類和公用工具方法的封裝時間,使開發(fā)專注于業(yè)務(wù),同時可以最大限度的避免封裝不完善帶來的 bug。

驗(yàn)證方法比較

僅僅從驗(yàn)證方法比較:

  • commons-validator除了通用驗(yàn)證方法外,還支持國際通用數(shù)字標(biāo)準(zhǔn)驗(yàn)證,比如:IBAN (International Bank Account Number)ISSN(International Standard Serial Number)、ISBN(International Standard Book Number)
  • hutool(Validator)通用驗(yàn)證方法與commons-validator基本一致,由于國人開源,驗(yàn)證方法較“中國”化些,比如:身份證、手機(jī)號、車牌號、郵政編碼、社會統(tǒng)一信用代碼、是否漢字等。

PS:hutool作者問題交流和合并 PR 那是極快的。

驗(yàn)證測試工程(基于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'
}

驗(yàn)證方法使用演示

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;

/**
 * 驗(yàn)證框架測試
 *
 * @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 在指定范圍內(nèi),其他類型一樣: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));
        // 正則表達(dá)式
        Assert.assertTrue(GenericValidator.matchRegexp("daodaotest", "^d.*t$"));
        // 信用卡驗(yàn)證
        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("叨叨軟件測試"));
        // 是否為數(shù)字
        Assert.assertTrue(Validator.isNumber("1.1"));
        // 是否字母,包括大寫和小寫字母
        Assert.assertTrue(Validator.isWord("daodaotest"));
        // 是否為英文字母 、數(shù)字和下劃線, 還支持:大寫和小寫字母和漢字(isLetter)
        Assert.assertTrue(Validator.isGeneral("dao_1"));
        // 是否全為大寫或小寫字母
        Assert.assertTrue(Validator.isLowerCase("daodaotest"));
        Assert.assertTrue(Validator.isUpperCase("DAODAOTEST"));
        // 檢查給定的數(shù)字是否在指定范圍內(nèi)
        Assert.assertTrue(Validator.isBetween(1,1,1));
        // 生日
        Assert.assertTrue(Validator.isBirthday("20200830"));
        // 18位 身份證號格式校驗(yàn),已經(jīng)提 PR,改為調(diào)用 IdcardUtil 的方法,估計(jì)5.4.1 版本更新
        Assert.assertTrue(Validator.isCitizenId("11010119900307299X"));
        // 身份證校驗(yàn),支持18位、15位和港澳臺的10位
        // 支持:10位(isValidCard10),15位(isValidCard15),18位(isValidCard18),香港(isValidHKCard),臺灣(isValidTWCard)
        Assert.assertTrue(IdcardUtil.isValidCard("11010119900307299X"));
        Assert.assertTrue(IdcardUtil.isValidCard18("11010119900307299X"));
        // 統(tǒng)一社會信用代碼(營業(yè)執(zhí)照注冊號)
        Assert.assertTrue(Validator.isCreditCode("91350500676532779B"));
        // 中國車牌號
        Assert.assertTrue(Validator.isPlateNumber("京A88888"));
        // 郵編
        Assert.assertTrue(Validator.isZipCode("100000"));
        // uuid
        Assert.assertTrue(Validator.isUUID(UUID.randomUUID().toString()));
        // 正則表達(dá)式
        Assert.assertTrue(Validator.isMatchRegex("^d.*t$","daodaotest"));
        // 手機(jī)號
        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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容