原文: https://howtodoinjava.com/hibernate/hibernate-validator-cdi/

注入默认 Java bean 验证类实现的 Hiberate 验证器 CDI 的 Java 示例。 javax.validation.ValidatorFactoryjavax.validation.Validator具有hibernate-validator-cdi依赖项。 如果应用具有多个org.hibernate.validator.cdi.HibernateValidator之类的验证器实现,还应该学习注入专门的验证器。

请注意,如果您的应用在开箱即用的环境中运行,那么您无需添加其他依赖项即可运行此示例。 例如,Spring 框架隐式提供了此类 CDI 基础结构,因此请不要在 Spring 框架中使用 Hiberate 验证器 CDI

对于其他应用,例如独立的 Java 应用,可能需要它才能使用注解创建HibernateValidator

1. Hibernate 验证器 CDI Maven 依赖项

下面列出了与 Hiberate 验证器一起使用的所有必需依赖项。

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd;
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.howtodoinjava.example</groupId>
  6. <artifactId>hibernate-validator</artifactId>
  7. <version>0.0.1</version>
  8. <packaging>jar</packaging>
  9. <name>hibernate-validator</name>
  10. <url>http://maven.apache.org</url>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>javax.inject</groupId>
  17. <artifactId>javax.inject</artifactId>
  18. <version>1</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>javax.validation</groupId>
  22. <artifactId>validation-api</artifactId>
  23. <version>2.0.1.Final</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.hibernate.validator</groupId>
  27. <artifactId>hibernate-validator</artifactId>
  28. <version>6.0.11.Final</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.hibernate.validator</groupId>
  32. <artifactId>hibernate-validator-cdi</artifactId>
  33. <version>6.0.11.Final</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>javax.el</groupId>
  37. <artifactId>javax.el-api</artifactId>
  38. <version>3.0.1-b06</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.glassfish.web</groupId>
  42. <artifactId>javax.el</artifactId>
  43. <version>2.2.6</version>
  44. </dependency>
  45. </dependencies>
  46. </project>

2. 带有验证注解的模型类

一个带有字段验证注解的简单 Java 类。

  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. //Getters and Setters
  22. @Override
  23. public String toString() {
  24. return "User [id=" + id + ", name=" + name + ", email=" + email + "]";
  25. }
  26. }

3. 注入默认的和 Hiberate javax.validation.Validator

使用@Inject注解注入ValidatorFactoryValidator。 注入的 Bean 是默认的验证器工厂实例和验证器实例。

  1. @Inject
  2. private static ValidatorFactory validatorFactory;
  3. @Inject
  4. private static Validator validator;

如果您正在使用多个 Bean 验证供应器,则可以通过使用@HibernateValidator限定符注解注入点来确保注入了 Hibernate 验证器的工厂和验证器。

  1. import org.hibernate.validator.cdi.HibernateValidator;
  2. @Inject
  3. @HibernateValidator
  4. private static ValidatorFactory validatorFactory;
  5. @Inject
  6. @HibernateValidator
  7. private static Validator validator;

4. 如何验证 bean

使用注入的验证器验证 Java Bean 和检查错误消息的示例。

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

程序输出:

  1. Aug 06, 2018 12:25:17 PM org.hibernate.validator.internal.util.Version <clinit>
  2. INFO: HV000001: Hibernate Validator 6.0.11.Final
  3. Please enter id
  4. '1' is an invalid name. It must be minimum 3 chars and maximum 20 chars.
  5. Invalid Email

上面的示例从类路径中的属性文件中获取资源消息

  1. user.name.invalid='${validatedValue}' is an invalid name. It must be minimum {min} chars and maximum {max} chars.
  2. user.email.invalid=Invalid Email

5. 总结

在上面的示例中,我们学习以下内容:

  • 我们如何包含 Hiberate 验证器 CDI 依赖项并使用它。
  • 如何注入默认的验证器工厂和验证器实例。
  • 如果存在多个 Java Bean 验证程序实现,则如何注入专用的验证程序工厂实例和验证程序实例。 例如,在上述情况下,它是 Hiberate 验证器。
  • 如何使用注解配置来验证 Java Bean。

学习愉快!