java validation_Java Bean Validation

本文详细介绍了如何使用JSR380(BeanValidation 2.0)标准框架进行JavaBean验证,包括依赖配置、常见验证注解的使用以及验证过程。示例中展示了如何处理用户输入验证,使用HibernateValidator作为参考实现,并给出了编程验证的步骤。

案例概述

在这本文中,我们将介绍使用标准框架验证Java bean的基础知识 - JSR 380,也称为Bean Validation 2.0。

当然,验证用户输入在大多数应用程序中是一个超常见的要求,Java Bean Validation框架已经成为处理这种逻辑的事实上的标准。

JSR 380

JSR 380是用于bean验证的Java API的规范,是JavaEE和JavaSE的一部分,它使用@NotNull、@Min和@Max等注释确保bean的属性满足特定的标准。

此版本需要Java 8或更高版本,并利用Java 8中添加的新功能(如类型注释),并支持Optional和LocalDate等新类型。

有关规范的完整信息,请继续阅读JSR 380。

依赖性

我们将使用Maven示例来显示所需的依赖项,但当然,可以使用各种方式添加这些jar。

验证API

根据JSR 380规范,validation-api依赖包含标准验证API:

javax.validation

validation-api

2.0.0.Final

验证API参考实现

Hibernate Validator是验证API的参考实现。

要使用它,我们必须添加以下依赖项:

org.hibernate.validator

hibernate-validator

6.0.2.Final

org.hibernate.validator

hibernate-validator-annotation-processor

6.0.2.Final

这里快速说明的是,hibernate-validator完全独立于Hibernate的持久性方面,并且通过将其添加为依赖项,我们不会将这些持久性方面添加到项目中。

表达式语言依赖关系

JSR 380提供对变量插值的支持,允许在违规消息中使用表达式。

要解析这些表达式,我们必须在表达式语言API和该API的实现上添加依赖项。GlassFish提供参考实现:

javax.el

javax.el-api

3.0.0

org.glassfish.web

javax.el

2.2.6

如果未添加这些JAR,您将在运行时收到错误消息,如下所示:

HV000183:无法加载'javax.el.E​​xpressionFactory'。检查您是否在类路径上有EL依赖项,或使用ParameterMessageInterpolator

使用验证注释

我们将在这里使用User bean作为主要示例,并为其添加一些简单的验证:

import javax.validation.constraints.AssertTrue;

import javax.validation.constraints.Max;

import javax.validation.constraints.Min;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import javax.validation.constraints.Email;

public class User {

@NotNull(message = "Name cannot be null")

private String name;

@AssertTrue

private boolean working;

@Size(min = 10, max = 200, message

= "About Me must be between 10 and 200 characters")

private String aboutMe;

@Min(value = 18, message = "Age should not be less than 18")

@Max(value = 150, message = "Age should not be greater than 150")

private int age;

@Email(message = "Email should be valid")

private String email;

// standard setters and getters

}

示例中使用的所有注释都是标准的JSR注释:

@NotNull - 验证带注释的属性值不为 null

@AssertTrue - 验证带注释的属性值是否为 true

@Size - 验证带注释的属性值是否具有属性min和max之间的大小; 可以应用于String, Collection, Map和数组属性

@Min - 验证带注释的属性的值是否小于value属性

@Max - 验证带注释的属性的值是否大于value属性

@Email - 验证带注释的属性是否为有效的电子邮件地址

某些注释接受其他属性,但message属性对所有属性都是通用的。这是当相应属性的值未通过验证时通常会呈现的消息。

可以在JSR中找到的一些其他注释是:

@NotEmpty - 验证属性不为null或为空; 可以应用于String, Collection, Map或 Array值

@NotBlank - 只能应用于文本值,并验证该属性不是null或空格

@Positive和@PositiveOrZero - 适用于数值并验证它们是严格正数还是正数,包括0

@Negative和@NegativeOrZero - 适用于数值并验证它们是严格为负数,还是负数,包括0

@Past和@PastOrPresent - 验证日期值是否过去,包括现在; 可以应用于日期类型,包括Java 8中添加的日期类型

@Future和@FutureOrPresent - 验证日期值是否将来包括现在

验证注释也可以应用于集合的元素:

List preferences;

在这种情况下,将验证添加到选项列表中的任何值。

该规范还支持 Java 8中的新Optional类型:

private LocalDate dateOfBirth;

public Optional getDateOfBirth() {

return Optional.of(dateOfBirth);

}

在这里,验证框架将自动解包LocalDate值并对其进行验证。

程序验证

一些框架 - 例如Spring--只需使用注释就可以通过简单的方法触发验证过程。这主要是为了使我们不必与程序验证API进行交互。

现在让我们进入手动路线并以编程方式设置:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

Validator validator = factory.getValidator();

要验证bean,我们必须首先拥有Validator对象,该对象使用ValidatorFactory构造。

定义Bean

我们现在要设置一个无效用户 - 使用空名称值:

User user = new User();

user.setWorking(true);

user.setAboutMe("Its all about me!");

user.setAge(50);

验证Bean

现在我们有了一个Validator,我们可以通过将它传递给validate方法来验证我们的bean 。任何违反User对象中定义的约束的行为都将作为Set返回。

Set> violations = validator.validate(user);

通过迭代违规,我们可以使用getMessage方法获取所有违规消息。

for (ConstraintViolation violation : violations) {

log.error(violation.getMessage());

}

在我们的示例中(ifNameIsNull_nameValidationFails),该集合将包含一个ConstraintViolation,消息“ Name not not null”。

案例结论

本文重点介绍了标准Java Validation API的简单传递,并使用javax.validation注释和API 说明了bean验证的基础知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值