原文: 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 Username
user.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 validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
//It validates bean instances
Validator validator = factory.getValidator();
User user = new User(null, "1", "abcgmail.com");
//Validate bean
Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
//Show errors
if (constraintViolations.size() > 0) {
for (ConstraintViolation<User> violation : constraintViolations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("Valid Object");
}
}
}
程序输出:
Please enter id
Invalid Email
Invalid 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。 |
将我的问题放在评论部分。
学习愉快!
参考文献: