Java Bean 基础验证

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(2303)   2023-03-28 11:29:14

1.概述

在这篇快速文章中,我们将介绍使用标准框架 - JSR 380(也称为Bean Validation 2.0)来验证Java bean的基础知识
当然,在大多数应用程序中验证用户输入是超常见的需求,而Java Bean验证框架已成为处理这种逻辑的事实上的标准。

2. JSR 380

JSR 380是用于Bean验证,JavaEE的和的JavaSE的一部分,这确保了一个bean的属性符合特定条件,使用注释如Java API的说明书中@NotNull@Min,和  @Max

该版本需要Java 8或更高版本,并利用Java 8中添加的新功能(例如类型注释),并支持新类型(如OptionalLocalDate)

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

3.依赖性

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

3.1。验证API

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

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

3.2。验证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的持久化方面功能模块,并且通过添加它作为依赖项,我们不会将这些持久性方面功能模块添加到项目中。
 

3.3。表达式语言依赖关系

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: Unable to load ‘javax.el.ExpressionFactory’. Check that you have the EL dependencies on the classpath, or use ParameterMessageInterpolator instead

4.使用验证注解

我们将在这里使用一个用户 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 - 验证注释的属性值是否为 
  • @Size  - 验证注释的属性值的大小在属性 min max之间 ; 可以应用于  String,  Collection,  Map和数组属性
  • @Min  -  v验证注释的属性的值不小于值 属性
  • @Max  - 验证注释的属性的值不大于属性
  • @电子邮件 - 验证注释的属性是一个有效的电子邮件地址

一些注释接受附加属性,但是消息属性对所有属性都是通用的。这是当相应属性的值未通过验证时通常会显示的消息。

JSR中可以找到的一些附加注释是:

  • @NotEmpty - 验证该属性不为空或空; 可以应用于 String Collection Map Array
  • @NotBlank - 只能应用于文本值并验证属性不为空或空白
  • @Positive @PositiveOrZero - 适用于数值并验证它们是严格正数,还是正数,包括0
  • @Negative @NegativeOrZero - 应用于数字值并验证它们是严格否定的,或者是否定的,包括0
  • @Past @PastOrPresent - 验证日期值是过去还是过去,包括现在; 可以应用于日期类型,包括在Java 8中添加的日期类型
  • @Future@FutureOrPresent - 验证日期值是未来还是未来,包括现在

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

List<@NotBlank String> preferences;

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

规范还支持 Java 8中的新的可选类型

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

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

5.程序化验证

一些框架 - 比如Spring--通过使用注释可以简单地触发验证过程。这主要是因为我们不必与编程验证API进行交互。

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

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

为了验证一个bean,我们必须首先有一个Validator对象,它是使用ValidatorFactory构造的  。

5.1。定义Bean

我们现在要设置这个无效的用户 - 具有空名称值:

User user = new User();
user.setWorking(true);
user.setAboutMe("Its all about me!");
user.setAge(50);

5.2。验证Bean

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

Set<ConstraintViolation<User>> violations = validator.validate(user);
通过遍历违规,我们可以通过使用getMessage 方法来获取所有违规消息。
for (ConstraintViolation<User> violation : violations) {
    log.error(violation.getMessage()); 
}

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

六,总结

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

本文中的概念的实现可以在GitHub项目中找到。我们将在即将发布的文章中介绍JSR 380和Hibernate Validator的更多功能。




 
标签: java java bean
地址:https://www.leftso.com/article/389.html

相关阅读

在这篇快速文章中,我们将介绍使用标准框架 - JSR 380(也称为Bean Validation 2.0)来验证Java bean的基础知识。当然,在大多数应用程序中验证用户输入是超常见的需求...
在本文中,我们将讨论如何使用Bean Validation 2.0(JSR-380)定义和验证方法约束。在前面的文章中,我们讨论了JSR-380及其内置的注释,以及如何实现属性验证。在这里,我们...
java编程中使用XStream实现java bean与XML的序列化和反序列化(一),本文主要讲解XStream的入门使用。编写一个简单的java bean通过XStream序列化为XML,将...
Map与Java bean之间的转换工具类,用于java.util.Map与普通javabean直接的相互转换,Java编程
fastJSON字符串类型数据中的日期转换为Java bean的日期对象
java8 Function 应用场景 --代码重构旧代码: import org.springframework.beans.BeanUtils; import java.util.func...
了解Spring bean 生命周期。我们将了解 bean生命周期阶段、初始化和销毁​​回调方法。我们将学习使用 XML 配置以及 Java 注释配置来自定义 bean 生命周期事件。1. 什么...
在 Spring 框架中,我们可以在 6 个内置的spring bean 作用域内创建 bean ,您也可以定义自定义 bean 作用域。在这六个作用域中,只有在您使用 Web 感知的Appli...
spring boot 项目启动报错 Failed to start bean 'documentationPluginsBootstrapper'; nested exception i...
在 Spring 框架中,按名称自动装配 bean 允许对属性进行自动装配,这样它将检查容器并查找名称与需要自动装配的属性完全相同的 bean。例如,如果您有一个按名称设置为自动装配的 bean...