hibernate-validator改进校验框架validator v0.4使用

yizhihongxing

来讲一下“hibernate-validator改进校验框架validator v0.4使用”的完整攻略。

什么是Hibernate-Validator?

Hibernate-Validator 是一款校验框架。这个框架的初衷是为了在 JavaBean 层面上提供一套统一、可重用的验证机制,使得我们在对 JavaBean 进行数据验证时能够更加方便、快捷、灵活。

为什么要改进校验框架?

虽然Hibernate-Validator 是一款很强大的校验框架,但是它并不完美。使用过程中也会存在一些问题,比如:

  • 对于一些非基本类型的校验,在实现上有些复杂。
  • 使用起来不是很方便,需要大量的注解。

所以,在实际的开发过程中,我们可能需要对 Hibernate-Validator 进行一些改进,以使其更加适合我们的实际需求。

改进

改进主要有两个方面,一个是简化校验逻辑,减少注解的使用;另一个是对于复杂类型的校验能够更加便捷。

简化校验逻辑

我们可以通过自定义注解,来简化校验逻辑。假设我们需要校验一个User对象,其中包含一个名字字段,这个字段的长度应该在1到10之间。原来的写法可能是这样:

public class User {
    @Size(min = 1, max = 10)
    private String name;
    ...
}

这里我们使用了 @Size 注解来进行校验。如果我们要在其他地方也需要对这个长度做校验,就需要再次在其他地方加上这个注解。代码冗余。

我们可以自定义注解,比如:

@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { UserNameValidator.class })
public @interface UserName {
    String message() default "名字长度不正确";

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

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

然后使用这个注解来替换原来的 @Size 注解:

public class User {
    @UserName
    private String name;
    ...
}

这样,我们就可以将校验逻辑定义在一个地方,避免了代码重复。

对于复杂类型的校验能够更加便捷

使用 Hibernate-Validator 进行校验一个 List,原来的写法可能是这样:

public void validate(List<User> users) {
    ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    for (User user : users) {
        Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);
        // ...
    }
}

这里我们需要手动遍历List,将每个User对象拿出来进行校验。这种写法不仅代码量大,还不够优雅。

我们可以使用一个注解 @Valid,这个注解可以直接将List中的对象进行校验。代码大大简化:

public void validate(@Valid List<User> users) {
    // ...
}

这个注解下文中会再次提到。

两条示例

我们举两个例子来说明 Hibernate-Validator 的使用方法和对其进行改进的方法。

示例一:校验日期格式

在开发过程中,我们可能需要对日期格式进行校验。Hibernate-Validator 中提供了一个注解 @Past,可以用来检查一个日期是否在当前时间之前。但是在实际场景中我们可能需要使用自己定义的日期格式来进行校验。

首先,我们自定义一个注解 DatePattern:

@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {DatePatternValidator.class})
public @interface DatePattern {

    String message() default "日期格式不正确";

    String pattern() default "yyyy-MM-dd";

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

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

    @Target({METHOD, FIELD, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        DatePattern[] value();
    }
}

其中这个注解有两个属性:message表示验证失败时的错误信息;pattern表示日期格式。

然后编写一个实现校验逻辑的validator:

public class DatePatternValidator implements ConstraintValidator<DatePattern, String> {

    private String pattern;

    @Override
    public void initialize(DatePattern constraintAnnotation) {
        pattern = constraintAnnotation.pattern();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        return TimeUtil.checkDateFormat(value.trim(), this.pattern);
    }
}

这里我们根据注解中的日期格式 pattern,使用 TimeUtil 工具类进行校验。TimeUtil.checkDateFormat() 的实现可以参考如下:

public static boolean checkDateFormat(String value, String format) {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        sdf.setLenient(false);
        sdf.parse(value);
        return true;
    } catch (ParseException e) {
        return false;
    }
}

这样,我们就可以使用 @DatePattern 注解来校验日期格式了:

public class Order {

    @DatePattern(message = "日期格式不正确", pattern = "yyyy-MM-dd HH:mm:ss")
    private String createTime;

    // getter & setter
}

示例二:校验内嵌对象

Hibernate-Validator 可以直接对一个对象进行校验。但是如果这个对象中还包含了其它对象,或者是一个 List,我们还需要手动去遍历,对其内部进行校验。为了解决这个问题,我们可以使用 @Valid 注解。

假设我们有一个 User 对象,它包含了一个地址,地址中又包含了城市和省份信息:

public class User {

    private String name;

    @Valid
    private Address address;

    // getter & setter
}

public class Address {

    private String city;

    private String province;

    // getter & setter
}

对于嵌套的对象,我们只需要在字段上使用 @Valid 注解,然后就可以进行递归校验了。

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

这里我们使用了 Hibernate-Validator 提供的 validate 方法,这个方法内部会自动递归进行校验。

另外,如果我们要对一个 List 进行校验,也可以使用 @Valid 注解:

public class Order {

    @NotNull(message = "订单不能为空")
    @Size(min = 1, message = "订单至少包含一项")
    @Valid
    private List<OrderItem> orderItems;

    // getter & setter
}

这样,就可以对 Order 对象中的 orderItems 进行校验了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:hibernate-validator改进校验框架validator v0.4使用 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java 数据库连接池 DBCP 的介绍

    Java 数据库连接池 DBCP 的介绍 什么是数据库连接池? 在传统的JDBC开发中,每次连接数据库都要进行数据库的连接和断开操作,这样会极大地浪费系统资源和时间,尤其是在高并发的情况下。为了解决这个问题,我们可以采用连接池技术,将一些连接预先放在池子中,在需要的时候从池子中获取连接,用完后再放回池子中,避免频繁的连接和断开操作。 DBCP 是什么? DB…

    Java 2023年5月19日
    00
  • Java下使用Oracle存储过程(详解)第3/3页

    下面是详细讲解“Java下使用Oracle存储过程(详解)第3/3页”的完整攻略。 1. 概述 这篇攻略主要介绍如何在Java中使用Oracle存储过程。存储过程是一组一起执行的SQL语句,可以接收参数并返回结果。在一些大型应用中,存储过程的使用可以提高数据库性能,减小网络传输压力,增加数据安全等等。 2. 实现步骤 步骤如下: (1)创建存储过程 首先在O…

    Java 2023年5月26日
    00
  • SpringBoot上传文件大小受限问题的解决办法

    关于SpringBoot上传文件大小受限问题的解决办法,在此提供完整攻略和两条示例。 问题描述 在SpringBoot的应用中,上传文件大小默认限制为1MB,如果上传的文件超过1MB,就会导致上传失败或无法上传。解决这个问题的方法就是通过设置最大的上传文件大小来解决。 解决办法 SpringBoot提供了两个配置参数来解决上传文件大小的限制问题。 1. 使用…

    Java 2023年5月19日
    00
  • Hibernate对数据库删除、查找、更新操作实例代码

    下面就是详细讲解 Hibernate 对数据库删除、查找、更新操作实例代码的完整攻略。 什么是 Hibernate Hibernate 是一个开源的、高性能的 Java ORM(对象关系映射)框架。它可以让我们通过面向对象的方式进行数据库操作,避免了 SQL 语句难以管理和维护的问题。 使用Hibernate,我们可以通过定义 Java 类与数据库表的映射关…

    Java 2023年5月19日
    00
  • 微信小程序 免费SSL证书https、TLS版本问题的解决办法

    针对“微信小程序 免费SSL证书https、TLS版本问题的解决办法”,我提供如下完整攻略。 什么是SSL证书和TLS版本 SSL证书可以理解为电子商务网站的身份证,用于证明网站的身份,并通过加密通讯来保护信息不被窃取。而TLS是SSL的升级版本,用于加密网络连接,并确保数据的完整性和机密性。 微信小程序使用SSL证书和TLS版本的必要性 微信小程序要求所有…

    Java 2023年5月23日
    00
  • Java面试题之基本语法(图解)

    Java 面试题之基本语法攻略 1. 概述 本篇攻略将涵盖 Java 基本语法面试题的相关知识点,包括数据类型、流程控制、对象、类、接口等方面。这些知识点是 Java 程序员必须了解和掌握的内容,在面试中也是常常被提及到的话题。掌握这些知识点能够让你在面试中更加得心应手。 本攻略分为以下几个部分: 数据类型 流程控制 对象与类 接口 2. 数据类型 Java…

    Java 2023年5月23日
    00
  • MyBatis动态SQL标签的用法详解

    MyBatis动态SQL标签的用法详解 MyBatis支持使用动态SQL标签,通过在XML中使用不同的标签和表达式可以很灵活地生成不同的SQL语句。在本文中,将详细讲解MyBatis动态SQL标签的使用方法。 if标签 if标签用于判断某个条件是否成立,如果成立则生成指定的SQL语句。示例: <select id="getUserList&q…

    Java 2023年5月20日
    00
  • 聊聊SpringBoot自动装配的魔力

    我来为你讲解一下关于“聊聊SpringBoot自动装配的魔力”的攻略。 什么是SpringBoot自动装配? Spring Boot是一个约定大于配置的框架,它大量使用自动配置来简化应用程序的开发。Spring Boot自动配置模块为Spring框架提供了很多自动检测和自动配置的功能,使得开发者可以专注于业务逻辑的开发而不需要过多关注底层技术的实现。 Spr…

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