原文: https://howtodoinjava.com/hibernate/hibernate-validator-cdi/
注入默认 Java bean 验证类实现的 Hiberate 验证器 CDI 的 Java 示例。 javax.validation.ValidatorFactory和javax.validation.Validator具有hibernate-validator-cdi依赖项。 如果应用具有多个org.hibernate.validator.cdi.HibernateValidator之类的验证器实现,还应该学习注入专门的验证器。
请注意,如果您的应用在开箱即用的环境中运行,那么您无需添加其他依赖项即可运行此示例。 例如,Spring 框架隐式提供了此类 CDI 基础结构,因此请不要在 Spring 框架中使用 Hiberate 验证器 CDI 。
对于其他应用,例如独立的 Java 应用,可能需要它才能使用注解创建HibernateValidator。
1. Hibernate 验证器 CDI Maven 依赖项
下面列出了与 Hiberate 验证器一起使用的所有必需依赖项。
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd;<modelVersion>4.0.0</modelVersion><groupId>com.howtodoinjava.example</groupId><artifactId>hibernate-validator</artifactId><version>0.0.1</version><packaging>jar</packaging><name>hibernate-validator</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.11.Final</version></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator-cdi</artifactId><version>6.0.11.Final</version></dependency><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.1-b06</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.6</version></dependency></dependencies></project>
2. 带有验证注解的模型类
一个带有字段验证注解的简单 Java 类。
package com.howtodoinjava.example.model;import javax.validation.constraints.Email;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;public class User {@NotNull(message = "Please enter id")private Long id;@Size(max = 20, min = 3, message = "{user.name.invalid}")@NotEmpty(message = "Please enter name")private String name;@Email(message = "{user.email.invalid}")@NotEmpty(message = "Please enter email")private String email;public User(Long id, String name, String email) {super();this.id = id;this.name = name;this.email = email;}//Getters and Setters@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", email=" + email + "]";}}
3. 注入默认的和 Hiberate javax.validation.Validator
使用@Inject注解注入ValidatorFactory和Validator。 注入的 Bean 是默认的验证器工厂实例和验证器实例。
@Injectprivate static ValidatorFactory validatorFactory;@Injectprivate static Validator validator;
如果您正在使用多个 Bean 验证供应器,则可以通过使用@HibernateValidator限定符注解注入点来确保注入了 Hibernate 验证器的工厂和验证器。
import org.hibernate.validator.cdi.HibernateValidator;@Inject@HibernateValidatorprivate static ValidatorFactory validatorFactory;@Inject@HibernateValidatorprivate static Validator validator;
4. 如何验证 bean
使用注入的验证器验证 Java Bean 和检查错误消息的示例。
package com.howtodoinjava.example;import java.util.Set;import javax.inject.Inject;import javax.validation.ConstraintViolation;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;import org.hibernate.validator.cdi.HibernateValidator;import com.howtodoinjava.example.model.User;public class TestHibernateValidator{@Inject@HibernateValidatorprivate static ValidatorFactory validatorFactory;@Inject@HibernateValidatorprivate static Validator validator;public static void main(String[] args){//Create ValidatorFactory which returns validatorvalidatorFactory = Validation.buildDefaultValidatorFactory();//It validates bean instancesvalidator = validatorFactory.getValidator();User user = new User(null, "1", "abcgmail.com");//Validate beanSet<ConstraintViolation<User>> constraintViolations = validator.validate(user);//Show errorsif (constraintViolations.size() > 0) {for (ConstraintViolation<User> violation : constraintViolations) {System.out.println(violation.getMessage());}} else {System.out.println("Valid Object");}}}
程序输出:
Aug 06, 2018 12:25:17 PM org.hibernate.validator.internal.util.Version <clinit>INFO: HV000001: Hibernate Validator 6.0.11.FinalPlease enter id'1' is an invalid name. It must be minimum 3 chars and maximum 20 chars.Invalid Email
上面的示例从类路径中的属性文件中获取资源消息。
user.name.invalid='${validatedValue}' is an invalid name. It must be minimum {min} chars and maximum {max} chars.user.email.invalid=Invalid Email
5. 总结
在上面的示例中,我们学习以下内容:
- 我们如何包含 Hiberate 验证器 CDI 依赖项并使用它。
- 如何注入默认的验证器工厂和验证器实例。
- 如果存在多个 Java Bean 验证程序实现,则如何注入专用的验证程序工厂实例和验证程序实例。 例如,在上述情况下,它是 Hiberate 验证器。
- 如何使用注解配置来验证 Java Bean。
学习愉快!
