资讯专栏INFORMATION COLUMN

Java Bean Validation

Imfan / 1740人阅读

摘要:表达式语言依赖关系提供对变量插值的支持,允许在违规消息中使用表达式。这是当相应属性的值未通过验证时通常会呈现的消息。任何违反对象中定义的约束的行为都将作为返回。案例结论本文重点介绍了标准的简单传递,并使用注释和说明了验证的基础知识。

案例概述

在这本文中,我们将介绍使用标准框架验证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<@NotBlank String> preferences;

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

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

private LocalDate dateOfBirth;
 
public Optional<@Past LocalDate> 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验证的基础知识。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73174.html

相关文章

  • 深入了解数据校验:Bean Validation 2.0(JSR380)

    摘要:可能有人认为数据校验模块并不是那么的重要,因为硬编码都可以做。我以数据绑定为引子引出了数据校验这一块,是想表明它的重要性。关于数据校验这块,最新的是,也就是我们常说的。 每篇一句 吾皇一日不退役,尔等都是臣子 对Spring感兴趣可扫码加入wx群:Java高工、架构师3群(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校验。可能有人认为数据校验模块...

    wangtdgoodluck 评论0 收藏0
  • 利用注解对Bean进行校验

    摘要:所以就有今天的话题利用注解对进行校验。利用注解对进行校验,主要是利用框架,实现了的接口关于校验的接口,直接使用非常方便,省时省力。 最近写业务代码,因为页面复杂,导致对应的Bean属性非常多,而产品大佬又提出各种校验要求。 emmmmmm......如果写if条件来校验,那简直是又臭又长。 所以就有今天的话题——利用注解对Bean进行校验。 利用注解对Bean进行校验,主要是利用hib...

    dmlllll 评论0 收藏0
  • Bean Validation完结篇:你必须关注的边边角角(约束级联、自定义约束、自定义校验器、国际

    摘要:和上标注的约束都会被执行注意如果子类覆盖了父类的方法,那么子类和父类的约束都会被校验。 每篇一句 没有任何技术方案会是一种银弹,任何东西都是有利弊的 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】Spring方法级别数据校...

    niuxiaowei111 评论0 收藏0
  • Spring方法级别数据校验:@Validated + MethodValidationPostPr

    摘要:就这样借助相关约束注解,就非常简单明了,语义清晰的优雅的完成了方法级别入参校验返回值校验的校验。但倘若是返回值校验执行了即使是失败了,方法体也肯定被执行了只能哪些类型上提出这个细节的目的是约束注解并不是能用在所有类型上的。 每篇一句 在《深度工作》中作者提出这么一个公式:高质量产出=时间*专注度。所以高质量的产出不是靠时间熬出来的,而是效率为王 相关阅读 【小家Java】深入了解数据校...

    孙吉亮 评论0 收藏0
  • 从深处去掌握数据校验@Valid的作用(级联校验)

    摘要:如果说要使用数据校验,我十分相信小伙伴们都能够使用,但估计大都是有个前提的环境。具体使用可参考小家让支持对平铺参数执行数据校验默认使用只能对进行校验级联校验什么叫级联校验,其实就是带校验的成员里存在级联对象时,也要对它完成校验。 每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(...

    BlackFlagBin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<