Java 常用驗證方法

背景

為了實現接口響應全量欄位斷言,開發斷言表達式框架時,除了調研常用的斷言框架之外,也調研了一些驗證框架和方法(非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("[email protected]"));
// 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("[email protected]"));
// ip
Assert.assertTrue(Validator.isIpv4("192.168.1.1"));
Assert.assertTrue(Validator.isIpv6("CDCD:910A:2222:5498:8475:1111:3900:2020"));
}
}

來源:kknewsJava 常用驗證方法