Java 常用验证方法(commons-validator,hutool)
背景
为了实现接口响应全量字段断言,开发断言表达式框架时,除了调研常用的断言框架之外,也调研了一些验证框架和方法(非hibernate-validator
、spring-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"));
}
}
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- frp内网穿透部署搭建教程,内网端口暴露给了外网
- Android使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信界面
- Linux安装Collabora Online让NextCloud支持Office在线编辑
- 教你在CentOS7安装Vuze(Azureus)
- Pwn-EXP模板
- Linux学习随手记
- PHP session用法其实很简单
- 爬虫代理适合的业务和场景
- Flutter基础widgets教程-OverflowBox篇
- iOS音视频接入- TRTC语音聊天室
- vscode使用COS作为图床编写markdown文档
- 一文爱上可视化神器Plotly_express
- 神策大数据用户行为分析
- 3分钟短文:为了你少跳坑,Laravel写好了用户授权
- 巧用ingest pipeline实现Elasticsearch索引的重定向