原文: https://howtodoinjava.com/hibernate/hibernate-validator-java-bean-validation/
使用 Hiberate 验证器验证 Java bean 字段的 Java 示例。 Bean 验证 API 2 (JSR-380)提供了一些流行的注解,可以将这些注解附加到每个 Bean 属性,以保持数据完整性。
1. Maven 依赖
以下是必需的 Hiberate 验证器 maven 依赖项。
Bean 验证允许错误消息中包含表达式。 要解析这些表达式,我们必须添加对表达式语言 API 以及该 API 实现的依赖。 我使用 Jboss 的javax.el中实现的javax.el-api规范添加了它们。
<!-- Java bean validation API - Spec --><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency><!-- Hibernate validator - Bean validation API Implementation --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.11.Final</version></dependency><!-- Verify validation annotations usage at compile time --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator-annotation-processor</artifactId><version>6.0.11.Final</version></dependency><!-- Unified Expression Language - Spec --><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.1-b06</version></dependency><!-- Unified Expression Language - Implementation --><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.6</version></dependency>
2. Hibernate 验证器示例
2.1 带有验证注解的模型
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;}//Setters and Getters}
2.2 消息属性
默认情况下,所有消息都是从类路径中的ValidationMessages.properties文件解析的。 如果文件不存在,则不会发生消息解析。
user.name.invalid=Invalid Usernameuser.email.invalid=Invalid Email
2.3 执行验证
现在,让我们在User实例上执行 bean 验证。
package com.howtodoinjava.example;import java.util.Set;import javax.validation.ConstraintViolation;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;import com.howtodoinjava.example.model.User;public class TestHibernateValidator{public static void main(String[] args){//Create ValidatorFactory which returns validatorValidatorFactory factory = Validation.buildDefaultValidatorFactory();//It validates bean instancesValidator validator = factory.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");}}}
程序输出:
Please enter idInvalid EmailInvalid Username
3. 自定义资源包
默认情况下,框架从类路径中的ValidationMessages.properties文件中提取验证消息。 您可以如下配置自己的自定义属性文件。
将这两个文件放在类路径中,即messages.properties和otherMessages.properties。 现在,将从这两个属性文件解析所有消息。
Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(new ResourceBundleMessageInterpolator(new AggregateResourceBundleLocator(Arrays.asList("messages","otherMessages")))).buildValidatorFactory().getValidator();
4. 消息插值
4.1 邮件参数解析
在消息解析期间,可以使用运行时值使验证消息更有意义。 消息中的参数值解析以两种方式发生:
- 要解析注解属性中的值,只需将大括号括起来即可。 例如。
{min}或{max}。 - 要解析字段的运行时值,请使用占位符
${validatedValue}。
4.2)参数解析示例
- 带有消息和参数的属性文件。
user.name.invalid='${validatedValue}' is an invalid name. It must be minimum {min} chars and maximum {max} chars.
- 带有验证注解的 Bean 字段。
@Size(max = 20, min = 3, message = "{user.name.invalid}")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=) |
验证带注解的字符序列是否在min和max之间。 |
@Range(min=, max=) |
检查带注解的值是否介于(包括)指定的最小值和最大值之间。 |
@UniqueElements |
检查带注解的集合仅包含唯一元素。 |
@URL |
根据 RFC2396 检查带注解的字符序列是否为有效 URL。 |
将我的问题放在评论部分。
学习愉快!
参考文献:
