1. 概述
本教程将带你快速掌握 Apache Commons Validator 的核心用法。作为 Apache Commons 家族的一员,这个库专门解决 Java 应用中的数据验证难题。我们将从实际应用场景切入,逐步讲解环境配置、内置验证器的使用,并深入探讨表单验证和 API 输入验证等实战案例。
2. 什么是 Apache Commons Validator?
Apache Commons Validator 是专门用于验证输入数据的 Java 库,内置了对邮箱、URL、日期等常见数据类型的验证支持。使用它能避免重复造轮子,同时确保验证逻辑在项目中的统一性。
2.1. 为什么需要验证库?
数据验证既容易出错又枯燥,特别是面对复杂约束时。像 Apache Commons Validator 这样的专用库能:
- ✅ 提供预构建的验证器,节省开发时间
- ✅ 保持代码整洁,避免自定义验证逻辑分散
- ✅ 强化应用安全性和数据完整性
2.2. 实际应用场景
API 接口需要严格验证输入格式。使用 Commons Validator 可以快速验证 HTTP 请求中的 URL、数值、信用卡号或邮编等数据,无需从零编写验证逻辑。
验证对系统安全至关重要。未经验证的数据可能导致 SQL 注入或 XSS 攻击。通过严格的输入验证规则:
- ⚠️ 阻止恶意数据进入系统
- ⚠️ 显著降低安全风险
- ⚠️ 确保只处理合法数据
3. Maven 依赖
在 pom.xml
中添加 commons-validator 依赖:
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.9.0</version>
</dependency>
4. 内置验证器
可复用的验证器位于 org.apache.commons.validator.routines 包。该库同时提供两套功能:标准验证函数和轻量级验证框架。自 1.3.0 版本起,这两部分被拆分到不同包中,当前包专注提供独立验证功能。
核心优势:
- 不依赖框架部分,可独立使用
- 线程安全设计
- 支持本地化配置
5. 日期时间验证器
日期时间验证器支持按指定格式或 Locale 标准格式验证,提供三种类型:
- 日期验证器:输出
java.util.Date
- 日历验证器:输出
java.util.Calendar
- 时间验证器:输出
java.util.Calendar
5.1. 验证日期值
通过 DateValidator
实现日期验证:
@Test
void givenDate_whenValidationIsCalled_thenChecksDate() {
DateValidator validator = DateValidator.getInstance();
String validDate = "28/01/2024";
String invalidDate = "28/13/2024";
assertNotNull(validator.validate(validDate, "dd/MM/yyyy"));
assertTrue(validator.isValid(validDate, "dd/MM/yyyy"));
assertNull(validator.validate(invalidDate, "dd/MM/yyyy"));
assertFalse(validator.isValid(invalidDate, "dd/MM/yyyy"));
GregorianCalendar gregorianCalendar = new GregorianCalendar(2024, Calendar.JANUARY, 28, 10, 30);
gregorianCalendar.setTimeZone(TimeZone.getTimeZone("GMT"));
Date date = gregorianCalendar.getTime();
assertEquals("28-Jan-2024", validator.format(date, "dd-MMM-yyyy"));
TimeZone timeZone = TimeZone.getTimeZone("GMT+5");
assertEquals("28/01/2024 15:30", validator.format(date, "dd/MM/yyyy HH:mm", timeZone));
}
测试验证了:
validate()
方法:合法日期返回 Date 对象,非法返回 nullisValid()
方法:返回布尔值表示有效性- 日期格式化功能(含时区处理)
6. 数值验证器
数值验证器支持按指定格式或 Locale 验证,提供多种类型验证器:
- Byte/Short/Integer/Long 验证器
- Float/Double 验证器
- BigInteger/BigDecimal 验证器
6.1. 验证数值
使用 IntegerValidator
进行数值验证:
@Test
void givenNumericString_whenValidationIsCalled_thenReturnsNumber() {
IntegerValidator validator = IntegerValidator.getInstance();
String pattern = "00000";
int number = 1234;
String formattedNumber = validator.format(number, pattern, Locale.US);
assertEquals(number, validator.validate(formattedNumber, pattern));
assertNotNull(validator.validate("123.4", Locale.GERMAN));
}
测试验证了:
- 数值格式化(按模式补零)
- 本地化数值解析(如德语环境的小数点处理)
7. 货币验证器
默认将货币金额转换为 java.math.BigDecimal
,支持宽松的货币符号验证(带/不带符号均可):
@Test
void givenCurrencyString_whenValidationIsCalled_thenReturnsCurrency() {
BigDecimalValidator validator = CurrencyValidator.getInstance();
assertEquals(new BigDecimal("1234.56"), validator.validate("$1,234.56", Locale.US));
assertEquals("$1,234.56", validator.format(1234.56, Locale.US));
}
测试验证了:
- 美国货币字符串解析
- 数值到货币格式的转换
8. 其他验证器
Apache Commons 还提供多种专用验证器:
验证器类型 | 功能说明 |
---|---|
正则验证器 | 使用 Java 1.4+ 正则表达式验证输入 |
校验码验证器 | 验证/计算 EAN/UPC、信用卡、ISBN 等校验码 |
代码验证器 | 综合验证代码格式、长度和校验位 |
ISBN 验证器 | 验证 ISBN-10/ISBN-13 格式 |
IP 地址验证器 | 验证 IPv4 地址格式 |
邮箱验证器 | 严格验证邮箱格式规范 |
URL 验证器 | 验证协议、域名和权限部分 |
域名验证器 | 对照 IANA TLD 列表验证域名 |
9. 总结
本教程通过实战案例展示了 Apache Commons Validator 的核心功能:
- ✅ 日期验证(
DateValidator
) - ✅ 数值验证(
IntegerValidator
) - ✅ 货币验证(
CurrencyValidator
) - ✅ 其他专用验证器
该库通过预构建验证器简化了常见数据验证场景,是 Java 开发中处理输入验证的利器。完整源码可在 GitHub 获取。