Java Bean Validation使用示例详解

 更新时间:2022年11月22日 15:50:08   作者:EdurtIO  
这篇文章主要为大家介绍了Java Bean Validation的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

使用标准框架验证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:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.0.Final</version>
</dependency>

验证API参考实现

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

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

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.2.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.0.2.Final</version>
</dependency>

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

表达式语言依赖关系

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

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

<dependency>
    <groupId>javax.el</groupId>
    <artifactId>javax.el-api</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.el</artifactId>
    <version>2.2.6</version>
</dependency>

如果未添加这些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<ConstraintViolation<User>> violations = validator.validate(user);

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

for (ConstraintViolation<User> violation : violations) {
    log.error(violation.getMessage()); 
}

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

以上就是Java Bean Validation使用示例详解的详细内容,更多关于Java Bean Validation的资料请关注脚本之家其它相关文章!

相关文章

  • JAVAEE项目结构以及并发随想

    JAVAEE项目结构以及并发随想

    每个代码里面的工具都是工具,API是你最需要理解的,哪个好,哪个不好,没有准确答案。 一切皆对象,对于Java来讲是纯粹的,代理是对象,反射是对象,对象是对象,基本数据类型不是对象。
    2016-04-04
  • Java实现游戏飞机大战-III的示例代码

    Java实现游戏飞机大战-III的示例代码

    这篇文章主要为大家介绍了如何利用Java实现经典的游戏之飞机大战,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试
    2022-02-02
  • SpringMVC中的ConversionServiceExposingInterceptor工具类解析

    SpringMVC中的ConversionServiceExposingInterceptor工具类解析

    这篇文章主要介绍了SpringMVC中的ConversionServiceExposingInterceptor工具类解析,ConversionServiceExposingInterceptor是Spring MVC的一个HandlerInterceptor,用于向请求添加一个属性,需要的朋友可以参考下
    2023-12-12
  • springboot 集成easy-captcha实现图像验证码显示和登录

    springboot 集成easy-captcha实现图像验证码显示和登录

    本文主要介绍了springboot 集成easy-captcha实现图像验证码显示和登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java并发编程同步器CountDownLatch

    Java并发编程同步器CountDownLatch

    这篇文章主要介绍了Java并发编程同步器CountDownLatch,文章基于Java并发编程的相关资料展开具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • springboot项目idea热部署的教程详解

    springboot项目idea热部署的教程详解

    这篇文章主要介绍了springboot项目idea热部署,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • MyBatis注解开发之实现自定义映射关系和关联查询

    MyBatis注解开发之实现自定义映射关系和关联查询

    本文主要详细介绍了MyBatis注解开发中,实现自定义映射关系和关联查询,文中有详细的代码示例,对学习MyBatis有一定的参考价值,需要的朋友可以参考阅读
    2023-04-04
  • Java Ribbon与openfeign区别和用法讲解

    Java Ribbon与openfeign区别和用法讲解

    Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便
    2022-08-08
  • spring为类的静态属性实现注入实例方法

    spring为类的静态属性实现注入实例方法

    在本篇文章里小编给大家整理的是关于spring为类的静态属性实现注入实例方法,有需要的朋友们可以参考下。
    2019-10-10
  • Spring MVC项目开发踩过的一些bug

    Spring MVC项目开发踩过的一些bug

    这篇文章主要给大家介绍了关于Spring MVC项目开发踩过的一些bug,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论