Java Bean 校验 API

简介: > 本文翻译自[Java Bean Validation Basics](https://www.baeldung.com/javax-validation) ## 概述 在这个文章里,我们简单介绍一如何使用标准校验框架来完成基本的Java Bean校验,该框架即JSR380,也被称为Bean Validation 2.0。 校验用户输入,在大多是应用程序中是超级常见的需求,Ja

本文翻译自Java Bean Validation Basics

概述

在这个文章里,我们简单介绍一如何使用标准校验框架来完成基本的Java Bean校验,该框架即JSR380,也被称为Bean Validation 2.0。

校验用户输入,在大多是应用程序中是超级常见的需求,Java Bean校验框架即是处理这部分逻辑的标准工具。

JSR308-Bean Validation 2.0

JSR 308是JavaBean校验API规范,它是JavaEE和JavaSE的一部分。该规范使用@NotNull,@Min和@Max这样的注解来确保一个Bean的属性符合特定的条件。

这个版本要求使用Java8或更高版本,利用Java8提供的新特性例如类型注解,并且支持新的类型例如Optional和LocalDate。

要获得更完整的信息,可以进一步阅读JSR 308的文档

依赖

  1. JSR 308规范的的标准API包含在validation-api中:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
  2. Hibernate Validator是validation-api的参考实现:

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

另外,Hibernate Validator还提供了一个注解处理器,利用Java编译时注解处理机制,帮助开发人员发现校验注解使用的错误。仅需要添加如下依赖即可:

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

hibernate-validator与hibernate的持久化框架支持是完全分离的,引入hibnernate-validator依赖并不会间接引入hibernate持久化相关的依赖。

  1. 表达式语言依赖

JSR 308规范支持违约信息的变量解析,并允许使用表达式。

为了解析表达式,我们必须添加表达式语言API和它的某个实现,GlassFish项目提供了表达式语言API的参考实现:

<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>

如果没有添加这些依赖到应用中,您会在运行时得到如下错误信息:

HV000183: Unable to load ‘javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead

使用校验注解

我们在这里使用UserBean作为例子,为它添加一些简单的校验。

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,@Max-校验备注解的属性值必须大于或小于指定的值
  • @Email-校验备注接的属性必须是有效的emal地址

JSR中还包含其他一些注解:

  • @NotEmpty-校验属性不能为null或空;可以在String,Collection,Map或数组类型属性上使用
  • @NotBlank-只能使用在文本类型的属性上,校验该属性不能为null或空白
  • @Positive,@PositiveOrZero-使用在数值属性上,校验该属性必须为正数或0
  • @Negative,@NegativeOrZero-使用在数值属性上,校验该属性必须为负数或0
  • @Past,@PastOrPresent-校验日期类型值必须是过去的时间或现在;支持Java8中新增加的日期类型,例如LocalDateTime
  • @Future,@FutureOrPresent-校验日期类型值必须在未来或现在

所有注解都可以设置messge属性,这个属性的值在校验失败时被用来渲染违约消息。

Validation-API提供的标准注解的message属性大都有默认值,使用者如无特别需求,无须设置该属性。

校验注解可以施加在集合的元素上

List<@NotBlank String> preferences;

在这个例子中,集合中的的所有元素都会被校验不能为null或空白

规范也支持Java8中新增的Optional类型:

private LocalDate dateOfBirth;
 
public Optional<@Past LocalDate> getDateOfBirth() {
    return Optional.of(dateOfBirth);
}

这个例子中,校验框架会自动将LocalDate值取出并校验。

编程校验

  1. 一些框架,例如Spring,仅仅使用注解即可出发校验过程。让我们不必直接编程使用校验API。但我们应当对其有所了解,以理解框架的运作原理。

下面让我们来手动编程配置一个校验环境:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

我们必须首先构建一个校验器(validator)对象,才能校验一个Bean。

  1. 定义一个待校验的Bean

    User user = new User();
    user.setWorking(true);
    user.setAboutMe("Its all about me!");
    user.setAge(50);
  2. 对上面定义的Bean进行校验

    Set<ConstraintViolation<User>> violations = validator.validate(user);

将user对象作为validate方法的参数传递给校验器对象,所有违背User对象定义的约束条件的信息包装为ConstraintViolation对象集合返回。

遍历违约信息,我们可以得到所有的违约消息

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

在我们的例子中,违约对象集合中只会包含一个违约信息,“Name cannot be null”。

这个违约消息可以通过校验注解的message属性进行定义。

总结

本教程聚焦于标准Java校验API的基本内容,展示了使用基本javax.validation注解和API的使用方法。

所有的示例代码可以在GitHub上获取。

目录
相关文章
|
2天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
5天前
|
存储 Java 关系型数据库
掌握Java 8 Stream API的艺术:详解流式编程(一)
掌握Java 8 Stream API的艺术:详解流式编程
32 1
|
14天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
15天前
|
XML Java 程序员
作为Java程序员还不知道Spring中Bean创建过程和作用?
作为Java程序员还不知道Spring中Bean创建过程和作用?
12 0
|
24天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
88 3
|
25天前
|
分布式计算 Java 程序员
Java 8新特性之Lambda表达式与Stream API
本文将详细介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种简洁、匿名的函数表示方法,它允许我们将函数作为参数传递给其他方法。而Stream API则是一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而提高代码的可读性和可维护性。通过本文的学习,你将能够掌握Lambda表达式和Stream API的基本用法,以及如何在项目中应用这两个新特性。
29 10
|
25天前
|
Java API 数据处理
Java 8新特性之Lambda表达式与Stream API
本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的语法结构,允许我们将函数作为参数传递给方法。而Stream API则是一种处理数据的新方式,它允许我们对数据进行更简洁、更高效的操作。通过学习这两个特性,我们可以编写出更简洁、更易读的Java代码。
|
26天前
|
Java API Maven
email api java编辑方法?一文教你学会配置步骤
在Java开发中,Email API是简化邮件功能的关键工具。本文指导如何配置和使用Email API Java:首先,在项目中添加javax.mail-api和javax.mail依赖;接着,配置SMTP服务器和端口;然后,创建邮件,设定收件人、发件人、主题和正文;最后,使用Transport.send()发送邮件。借助Email API Java,可为应用添加高效邮件功能。
|
30天前
|
Java API 数据处理
Java 8新特性之Lambda表达式和Stream API
【2月更文挑战第27天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给方法,从而使代码更加简洁。Stream API是一种处理数据的新方法,它可以让我们以声明式方式处理数据,提高代码的可读性和可维护性。
|
1月前
|
Java API Maven
使用Java和Spring Boot构建RESTful API
使用Java和Spring Boot构建RESTful API
16 0