Java 数据验证:工具与库概览

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java 数据验证:工具与库概览



数据验证(正确性检查)是任何应用程序开发的关键阶段之一。如果没有可靠的输入数据检查,应用程序将容易受到错误、异常行为以及攻击的影响。在 Java 中,有几种经过验证的方法和库,可以快速、灵活地实现验证,并且样板代码最少。



在本文中,我们将介绍 Java 中用于数据验证的主要工具:Bean Validation (Jakarta Validation) 标准、其最流行的实现 Hibernate Validator,以及替代方案 Apache Commons Validator。我们还将单独讨论针对简单情况的手动验证。



1. Bean Validation (Jakarta Validation) 标准



Bean Validation(以前是 JSR 380,现在是 Jakarta Validation)是一个规范,定义了一组用于声明式验证 Java 对象的注解。核心思想是:您使用注解在类的字段中直接描述验证规则,验证引擎会自动检查它们。



主要注解



  • @NotNull — 值不能为 null。
  • @NotEmpty — 字符串、集合或数组不能为空(且不能为 null)。
  • @NotBlank — 字符串不能为空或仅包含空格。
  • @Size(min, max) — 限制字符串长度、集合或数组的大小。
  • @Min / @Max — 数值限制。
  • @Pattern(regexp = "...") — 根据正则表达式进行验证。
  • @Email — 验证电子邮件地址格式。


使用示例



import jakarta.validation.constraints.*;

public class User { @NotBlank(message = "姓名不能为空") @Size(min = 2, max = 50) private String name;

@Email(message = "电子邮件格式不正确") @NotNull private String email;

@Min(18) @Max(120) private int age;

// getters 和 setters}


要启动验证,请使用 Validator 对象:



import jakarta.validation.*;import java.util.Set;

public class ValidationExample { public static void main(String[] args) { ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator();

User user = new User(); user.setName("A"); user.setEmail("invalid-email"); user.setAge(10);

Set<ConstraintViolation<User>> violations = validator.validate(user); for (ConstraintViolation<User> violation : violations) { System.out.println(violation.getMessage()); } }}


2. Hibernate Validator — 标准的实现



Hibernate Validator 是 Bean Validation 规范的参考实现。它完全支持 Jakarta Validation 的所有注解,并添加了自己的扩展,例如 @URL、@CreditCardNumber、@ISBN 等。



附加功能

  • 自定义验证器 — 您可以创建自己的注解和验证逻辑。
  • 验证组 — 根据上下文(例如,创建 vs 更新)检查不同的规则集。
  • 与 Spring Boot、Java EE / Jakarta EE 开箱即用集成。


自定义验证器示例



import jakarta.validation.Constraint;import jakarta.validation.Payload;import java.lang.annotation.*;

@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = PhoneValidator.class)public @interface ValidPhone { String message() default "电话号码格式不正确";

推荐