原文: https://howtodoinjava.com/hibernate/hibernate-validator-java-bean-validation/

使用 Hiberate 验证器验证 Java bean 字段的 Java 示例。 Bean 验证 API 2JSR-380)提供了一些流行的注解,可以将这些注解附加到每个 Bean 属性,以保持数据完整性。

1. Maven 依赖

以下是必需的 Hiberate 验证器 maven 依赖项

Bean 验证允许错误消息中包含表达式。 要解析这些表达式,我们必须添加对表达式语言 API 以及该 API 实现的依赖。 我使用 Jboss 的javax.el中实现的javax.el-api规范添加了它们。

  1. <!-- Java bean validation API - Spec -->
  2. <dependency>
  3. <groupId>javax.validation</groupId>
  4. <artifactId>validation-api</artifactId>
  5. <version>2.0.1.Final</version>
  6. </dependency>
  7. <!-- Hibernate validator - Bean validation API Implementation -->
  8. <dependency>
  9. <groupId>org.hibernate</groupId>
  10. <artifactId>hibernate-validator</artifactId>
  11. <version>6.0.11.Final</version>
  12. </dependency>
  13. <!-- Verify validation annotations usage at compile time -->
  14. <dependency>
  15. <groupId>org.hibernate</groupId>
  16. <artifactId>hibernate-validator-annotation-processor</artifactId>
  17. <version>6.0.11.Final</version>
  18. </dependency>
  19. <!-- Unified Expression Language - Spec -->
  20. <dependency>
  21. <groupId>javax.el</groupId>
  22. <artifactId>javax.el-api</artifactId>
  23. <version>3.0.1-b06</version>
  24. </dependency>
  25. <!-- Unified Expression Language - Implementation -->
  26. <dependency>
  27. <groupId>org.glassfish.web</groupId>
  28. <artifactId>javax.el</artifactId>
  29. <version>2.2.6</version>
  30. </dependency>

2. Hibernate 验证器示例

2.1 带有验证注解的模型

  1. package com.howtodoinjava.example.model;
  2. import javax.validation.constraints.Email;
  3. import javax.validation.constraints.NotEmpty;
  4. import javax.validation.constraints.NotNull;
  5. import javax.validation.constraints.Size;
  6. public class User {
  7. @NotNull(message = "Please enter id")
  8. private Long id;
  9. @Size(max = 20, min = 3, message = "{user.name.invalid}")
  10. @NotEmpty(message = "Please enter name")
  11. private String name;
  12. @Email(message = "{user.email.invalid}")
  13. @NotEmpty(message = "Please enter email")
  14. private String email;
  15. public User(Long id, String name, String email) {
  16. super();
  17. this.id = id;
  18. this.name = name;
  19. this.email = email;
  20. }
  21. //Setters and Getters
  22. }

2.2 消息属性

默认情况下,所有消息都是从类路径中的ValidationMessages.properties文件解析的。 如果文件不存在,则不会发生消息解析

  1. user.name.invalid=Invalid Username
  2. user.email.invalid=Invalid Email

2.3 执行验证

现在,让我们在User实例上执行 bean 验证。

  1. package com.howtodoinjava.example;
  2. import java.util.Set;
  3. import javax.validation.ConstraintViolation;
  4. import javax.validation.Validation;
  5. import javax.validation.Validator;
  6. import javax.validation.ValidatorFactory;
  7. import com.howtodoinjava.example.model.User;
  8. public class TestHibernateValidator
  9. {
  10. public static void main(String[] args)
  11. {
  12. //Create ValidatorFactory which returns validator
  13. ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
  14. //It validates bean instances
  15. Validator validator = factory.getValidator();
  16. User user = new User(null, "1", "abcgmail.com");
  17. //Validate bean
  18. Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
  19. //Show errors
  20. if (constraintViolations.size() > 0) {
  21. for (ConstraintViolation<User> violation : constraintViolations) {
  22. System.out.println(violation.getMessage());
  23. }
  24. } else {
  25. System.out.println("Valid Object");
  26. }
  27. }
  28. }

程序输出:

  1. Please enter id
  2. Invalid Email
  3. Invalid Username

3. 自定义资源包

默认情况下,框架从类路径中的ValidationMessages.properties文件中提取验证消息。 您可以如下配置自己的自定义属性文件

将这两个文件放在类路径中,即messages.propertiesotherMessages.properties。 现在,将从这两个属性文件解析所有消息。

  1. Validator validator = Validation.byDefaultProvider()
  2. .configure()
  3. .messageInterpolator(
  4. new ResourceBundleMessageInterpolator(
  5. new AggregateResourceBundleLocator(
  6. Arrays.asList(
  7. "messages",
  8. "otherMessages"
  9. )
  10. )
  11. )
  12. )
  13. .buildValidatorFactory()
  14. .getValidator();

4. 消息插值

4.1 邮件参数解析

在消息解析期间,可以使用运行时值使验证消息更有意义。 消息中的参数值解析以两种方式发生:

  1. 要解析注解属性中的值,只需将大括号括起来即可。 例如。 {min}{max}
  2. 要解析字段的运行时值,请使用占位符${validatedValue}

4.2)参数解析示例

  • 带有消息和参数的属性文件。
    1. user.name.invalid='${validatedValue}' is an invalid name. It must be minimum {min} chars and maximum {max} chars.
  • 带有验证注解的 Bean 字段。
    1. @Size(max = 20, min = 3, message = "{user.name.invalid}")
    2. private String name;
  • 程序输出中已解决的消息。 ```java User user = new User(23l, “xy”, “abc@gmail.com”); Set> constraintViolations = validator.validate(user);

//Output

‘xy’ is an invalid name. It must be minimum 3 chars and maximum 20 chars. ```

5. Hiberate 验证器注解

现在,当我们知道如何以编程方式使用 Hiberate 验证器时。 让我们看一下可以在 bean 类中使用的所有注解。

5.1 Bean 验证注解

注解 描述
@Digits(integer=, fraction=) 检查注解的值是否为最多integer位和fractional小数位的数字。
@Email 检查指定的字符序列是否为有效的电子邮件地址。
@Max(value=) 检查带注解的值是否小于或等于指定的最大值。
@Min(value=) 检查带注解的值是否大于或等于指定的最小值
@NotBlank 检查带注解的字符序列不为空,并且修剪后的长度大于 0。
@NotEmpty 检查带注解的元素是否不为null或为空。
@Null 检查带注解的值是否为空
@NotNull 检查带注解的值不为空
@Pattern(regex=, flags=) 考虑给定的flag匹配项,检查带注解的字符串是否与正则表达式regex匹配
@Size(min=, max=) 检查带注解的元素的大小是否在最小和最大(包括)之间
@Negative 检查元素是否严格为负。 零值被视为无效。
@NegativeOrZero 检查元素是负数还是零。
@Future 检查带注解的日期是否是将来的日期。
@FutureOrPresent 检查带注解的日期是现在还是将来。
@PastOrPresent 检查带注解的日期是过去还是现在。

5.2 Hiberate 验证器特定的注解

除了 Bean 验证 API 定义的约束之外,Hibernate 验证器还提供了以下有用的自定义约束。

注解 描述
@CreditCardNumber( ignoreNonDigitCharacters=) 检查带注解的字符序列是否通过了 Luhn 校验和测试。 请注意,此验证旨在检查用户错误,而不是信用卡有效性!
@Currency(value=) 检查带注解的javax.money.MonetaryAmount的货币单位是否为指定货币单位的一部分。
@EAN 检查带注解的字符序列是否为有效的 EAN 条形码。 默认值为 EAN-13。
@ISBN 检查带注解的字符序列是否为有效的 ISBN
@Length(min=, max=) 验证带注解的字符序列是否在minmax之间。
@Range(min=, max=) 检查带注解的值是否介于(包括)指定的最小值和最大值之间。
@UniqueElements 检查带注解的集合仅包含唯一元素。
@URL 根据 RFC2396 检查带注解的字符序列是否为有效 URL。

将我的问题放在评论部分。

学习愉快!

参考文献:

Bean 验证 2.0

Hiberate 验证器注解处理器