五分钟带你了解Java的接口数据校验

yizhihongxing

介绍Java中的接口数据校验,通常使用的是验证框架Hibernate Validator。我们可以使用它来验证javabean实例的数据是否合法。

安装 Hibernate Validator

在Maven中,我们可以使用以下代码引入Hibernate Validator:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>${hibernate-validator.version}</version>
</dependency>

注意:hibernate-validator.version应该替换成正确的版本号。

定义验证约束

使用Hibernate Validator,我们可以使用注解来定义校验约束,下面是一些常见的注解:

  • @NotNull —— 检查是否为null。
  • @NotEmpty —— 检查是否为空(“”),或者长度为0的字符串。
  • @Size —— 检查字符串的长度是否在一个包含最小值和最大值的区间内。
  • @Min —— 检查数值是否大于等于指定的值。
  • @Max —— 检查数值是否小于等于指定的值。
  • @Positive —— 检查数值是否为正数。
  • @Negative —— 检查数值是否为负数。
  • @Email —— 检查是否为邮箱地址。

示例1

我们来看一个简单的示例,验证一个学生对象是否符合我们的校验规则:

public class Student {
    @NotNull
    @Size(min = 2, max = 30)
    private String name;

    @NotNull
    @Positive
    private Integer age;

    @NotNull
    private String gender;

    @NotNull
    @Email
    private String email;

    // getters/setters omitted
}

在上面的代码中,我们定义了一个Java bean实体类Student,并在属性上添加了一些校验约束注解。简单解释一下这些注解的含义:

  • @NotNull —— 这个注解表示该字段不能为空(也就是不能为null),如果该字段为null,将会引发异常。
  • @Size(min = 2, max = 30) —— 这个注解表示该字段的长度必须在2到30之间(包含2和30),如果该字段长度不在这个区间内,则会引发异常。
  • @Positive —— 这个注解表示该字段必须是正数,如果该字段不是正数,则会引发异常。
  • @Email —— 这个注解表示该字段必须是一个合法的邮箱地址,如果该字段不是一个合法的邮箱地址,则会引发异常。

以上约束注解可以根据实际需求进行增加、删除或修改。

我们可以使用如下方法,检验一个学生对象是否符合上面的约束要求:

public static void main(String[] args) {
    Student student = new Student();
    student.setName("Tom");
    student.setAge(18);
    student.setGender("male");
    student.setEmail("tom@test.com");
    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
    Validator validator = vf.getValidator();
    Set<ConstraintViolation<Student>> violations = validator.validate(student);
    for (ConstraintViolation<Student> violation : violations) {
        System.out.println(violation.getMessage());
    }
}

我们将Student对象传递给Validatorvalidate()方法,这将返回一个Set集合,该集合包含了所有未通过验证的验证约束对象的信息,例如age字段值不能为null和不能为负数。

示例2

在下面的示例中,我们使用一个list进行数据更新。我们可以验证其中的join时间是否符合需求:

```java
public class Book {
@NotNull
private String name;

private Integer pageCount;

@NotNull
@ISODate
private LocalDateTime publishDate;

@NotNull
@ISODateTime
private LocalDateTime joinTime;

set/get omitted

}


我们在`joinTime`字段上定义了一个注解`@ISODateTime`,这个注解表示该字段必须是一个符合ISO 8601日期时间格式的字符串。下面是`@ISODateTime`注解的定义:

```java
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ISODateTimeValidator.class)
public @interface ISODateTime {
    String message() default "Invalid ISO date time format";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

注意:ISODateTimeValidator是一个自定义校验器,是我们自己编写的,下面将详细介绍如何编写自定义的校验器。

我们再来看一个示例,这个示例演示了如何使用@ISODate@ISODateTime注解来验证日期和时间:

public static void main(String[] args) {
    List<Book> bookList = new ArrayList<>();
    Book book1 = new Book();
    book1.setName("Java Basic");
    book1.setPageCount(200);
    book1.setPublishDate(LocalDateTime.of(2019, 1, 1, 0, 0, 0));
    book1.setJoinTime(LocalDateTime.now().plusMonths(1));
    bookList.add(book1);
    Book book2 = new Book();
    book2.setName("Java Advanced");
    book2.setPageCount(300);
    book2.setPublishDate(LocalDateTime.of(2018, 6, 1, 0, 0, 0));
    book2.setJoinTime(LocalDateTime.of(2021, 1, 1, 0, 0, 0));
    bookList.add(book2);
    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
    Validator validator = vf.getValidator();
    for (Book book : bookList) {
        Set<ConstraintViolation<Book>> violations = validator.validate(book);
        for (ConstraintViolation<Book> violation : violations) {
            System.out.println(violation.getMessage());
        }
    }
}

在上面的示例中,我们首先创建了一个Book的list,然后为其中的两本书设置了不同的属性。我们将Book对象传递到Validatorvalidate()方法中,对每本书进行校验。

编写自定义校验器

我们可以编写自己的校验器来实现不同类型的校验规则。下面是一个简单的示例,展示了如何自定义校验器来验证日期时间格式:

public class ISODateTimeValidator implements ConstraintValidator<ISODateTime, String> {
    private Pattern pattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$");

    @Override
    public void initialize(ISODateTime isoDateTime) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        if (!pattern.matcher(value).matches()) {
            return false;
        }
        try {
            LocalDateTime.parse(value);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }
}

在上面的示例中,我们定义了一个ISODateTimeValidator校验器,它实现了ConstrainValidator<ISODateTime, String>接口。我们需要指定两个泛型,分别是我们自己定义的约束注解类型和我们需要进行验证的值类型。这里我们定义了一个正则表达式,用来校验日期时间格式是否符合要求。如果值符合要求,则将返回true

注意:我们必须实现initialize()方法,但该方法不需要内容。另外,在实现isValid()方法时,我们需要返回一个布尔类型的值,如果验证通过则返回true,否则返回false,并记录有错误的信息。所有错误信息会在调用validate()方法时传递给调用者。

总结

使用Hibernate Validator可以轻松地验证Java bean对象的数据。上面示例中的注解只是Hibernate支持的所有注解类型的一小部分。如果需要使用不同的注解或编写自己的自定义验证器,可以通过在Java bean对象的属性上添加注解来自定义验证规则,或通过编写自定义的注解来实现自定义校验器。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:五分钟带你了解Java的接口数据校验 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • java的jdk基础知识点总结

    Java JDK基础知识点总结 Java JDK是Java开发的核心工具包,包含了许多开发和运行Java程序所需要的基本组件。以下是Java JDK的一些基础知识点总结。 JDK、JRE和JVM之间的关系 JDK(Java Development Kit)是开发Java应用程序所需要的工具包,它包含了完整的JRE和一些开发工具,如编译器和调试器。 JRE(J…

    Java 2023年5月20日
    00
  • JSP简明教程:令人兴奋的脚本编程

    JSP简明教程:令人兴奋的脚本编程 什么是JSP JSP(JavaServer Pages)是一种用于创建动态Web页面的技术,它允许在HTML页面中编写Java代码,以实现动态处理和内容生成。在JSP页面中,可以使用Java代码、HTML标签和JSP标签,以及表达式语言(EL)来动态生成页面内容。 JSP的工作原理 JSP页面在服务器端动态生成,当用户请求…

    Java 2023年6月15日
    00
  • Spring Security OAuth2 token权限隔离实例解析

    Spring Security OAuth2 token权限隔离实例解析 在本文中,将介绍如何使用Spring Security来实现OAuth2 token的权限隔离。我们将阐述基于Spring Boot的实现方式及其持久化方案,并提供两条示例。 情境描述 假设一个应用程序需要提供给多个客户端进行访问,而每个客户端都有自己的用户组并需要访问特定的资源。在这…

    Java 2023年5月20日
    00
  • 详解Java中的防抖和节流

    Title: 详解Java中的防抖和节流 防抖和节流是前端开发中常用的优化方式,可以避免用户输入事件过于频繁导致页面性能下降。在Java开发中,同样可以使用这两种技术进行优化。 什么是防抖和节流 防抖 防抖是指在用户进行操作时,只有停止操作一段时间后才会触发事件并进行相应操作。这种方式可以避免用户频繁地触发事件导致页面反应缓慢,同时也可以避免一些不必要的重复…

    Java 2023年5月26日
    00
  • Java多线程文件分片下载实现的示例代码

    Java多线程文件分片下载可以极大地提升文件下载速度。以下是一个 Java 多线程文件分片下载的示例代码及其详细实现攻略。 1. 需求分析 我们需要实现一个能够从远程服务器下载大文件的 Java 应用,目标是最大限度地提升下载速度。使用多线程进行文件分片下载,可以让每个线程分别下载小部分文件,提高下载速度。 2. 技术方案 Java 有完善的多线程机制,因此…

    Java 2023年5月26日
    00
  • Java实现的对称加密算法3DES定义与用法示例

    Java实现的对称加密算法3DES定义与用法示例 1. 什么是3DES 3DES(Triple DES)是一种对称加密算法,常用于数据加密、数字签名等场景。它是DES(Data Encryption Standard)算法的增强版,采取3次DES步骤进行加密,因此也被称为TDEA(Triple Data Encryption Algorithm)。 3DES…

    Java 2023年5月18日
    00
  • SpringBoot整合sharding-jdbc实现分库分表与读写分离的示例

    下面我将为您介绍如何通过Spring Boot整合sharding-jdbc实现分库分表和读写分离。 一、概述 sharding-jdbc是一个基于JDBC规范的分布式数据库中间件,它提供了易于使用、高度定制化的分片、读写分离、柔性事务等功能。Spring Boot是一款开发快速的Java企业开发框架,在分布式项目中得到广泛应用。 对于需要进行数据分片和读写…

    Java 2023年5月20日
    00
  • WINDOWS系统 + Apache +PHP5 +Zend + MySQL + phpMyAdmin安装配置方法

    安装和配置WINDOWS系统 + Apache + PHP5 + Zend + MySQL + phpMyAdmin的步骤如下: 步骤一:安装Apache 1.下载Apache的Windows版本,建议使用官方的Apache Lounge版本,下载地址https://www.apachelounge.com/download/ 2.解压缩下载的安装包。 3.…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部