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 版本起,这两部分被拆分到不同包中,当前包专注提供独立验证功能。

核心优势:

  1. 不依赖框架部分,可独立使用
  2. 线程安全设计
  3. 支持本地化配置

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 对象,非法返回 null
  • isValid() 方法:返回布尔值表示有效性
  • 日期格式化功能(含时区处理)

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 获取。


原始标题:Introduction to Apache Commons Validator | Baeldung