深入探究validation-api

一、validation api 自定义注解

在使用validation-api时,使用自定义注解可以更好的满足业务需求。在Java中,可以通过注解方式定义验证规则,然后通过validator对数据进行验证。

下面是一个自定义注解的示例:

public @interface Age {
    String message() default "年龄不符合要求";

    Class[] groups() default {};

    Class[] payload() default {};

    int maxAge() default 200;

    int minAge() default 0;
}

该自定义注解的作用是对年龄进行验证。通过maxAge和minAge定义了年龄的取值范围。

使用时,可以在实体类的属性上添加自定义注解:

public class User {

    @Age(minAge = 18, maxAge = 60, message = "年龄不符合要求")
    private Integer age;

    //其他属性和方法
}

使用validator进行验证时,如果年龄不在18到60的范围内,将会抛出ValidationException异常。

二、validation api 分组检验

在实际开发中,经常会遇到一种情况:同一实体类在不同场景下需要验证不同的属性。此时可以使用validation api的分组检验功能。

定义分组:

public interface UpdateGroup {
}

public interface AddGroup {
}

在实体类中使用注解指定分组:

public class User {

    @NotNull(groups = {AddGroup.class})
    private String username;

    @NotNull(groups = {AddGroup.class})
    private String password;

    @NotNull(groups = {UpdateGroup.class})
    private String nickname;

    //其他属性和方法
}

使用validator时指定检验分组:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation> constraintViolationSet = validator.validate(user, AddGroup.class);

这样就只会检验AddGroup分组中的属性了,而UpdateGroup分组中的属性则不会被检验。

三、使用validator对数据进行验证

最常用的是使用validator对数据进行验证。下面是一个使用validator的示例代码:

public static  Map validate(T obj) {
    Map resultMap = new HashMap();
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation> constraintViolationSet = validator.validate(obj);
    if (constraintViolationSet != null && constraintViolationSet.size() > 0) {
        for (ConstraintViolation constraintViolation : constraintViolationSet) {
            resultMap.put(constraintViolation.getPropertyPath().toString(), constraintViolation.getMessage());
        }
    }
    return resultMap;
}

可以看到,这段代码中使用了buildDefaultValidatorFactory方法来获取默认的validator。获取到validator后,就可以对obj进行验证。

四、使用validation-api进行格式化输出

在验证数据时,常常需要给用户告知错误信息。通常情况下,错误信息都是非常简短的。为了更好的告知用户错误信息,validation-api提供了一种非常好的机制来格式化错误信息。

下面是一个使用validation-api对错误信息进行格式化的示例:

public static  String validateAndFormat(T obj) {
    Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    Set<ConstraintViolation> constraintViolationSet = validator.validate(obj);
    if (constraintViolationSet != null && constraintViolationSet.size() > 0) {
        StringBuilder sb = new StringBuilder();
        for (ConstraintViolation constraintViolation : constraintViolationSet) {
            sb.append(constraintViolation.getPropertyPath()).append(":").append(constraintViolation.getMessage()).append(",");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    } else {
        return "";
    }
}

可以看到,这个方法首先使用validator.validate(obj)方法对数据进行验证,如果有错误信息,则用StringBuilder将错误信息格式化后返回。

五、使用validation-api进行快速验证

validation-api不仅提供了对实体对象的验证,还提供了对数据的快速验证。如果要验证数据是否满足某个规则,比如手机号码是否合法,就可以使用快速验证。

下面是一个使用validation-api进行快速验证的示例:

public static boolean isMobile(String str) {
    if (StringUtils.isBlank(str)) {
        return false;
    }
    Pattern pattern = Pattern.compile("^(13\\d|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|16[6]|17[0|1|2|3|4|5|6|7|8]|18\\d|19[8|9])\\d{8}$");
    Matcher matcher = pattern.matcher(str);
    return matcher.matches();
}

这里使用了正则表达式来验证手机号。

六、总结

本文围绕validation-api展开了多个方面的详细介绍,从自定义注解、分组检验、数据验证、格式化输出、快速验证等多个方面进行了详细的探究。通过本文的介绍可以看出,validation-api是一个非常强大的验证框架,能够在实际开发中大大提高我们的工作效率,减少开发出错的风险。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/288598.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-24 03:00
下一篇 2024-12-24 03:00

相关推荐

  • 掌握magic-api item.import,为你的项目注入灵魂

    你是否曾经想要导入一个模块,但却不知道如何实现?又或者,你是否在使用magic-api时遇到了无法导入的问题?那么,你来到了正确的地方。在本文中,我们将详细阐述magic-api的…

    编程 2025-04-29
  • Vertx网关:高效率的API网关中心

    Vertx是一个基于JVM的响应式编程框架,是最适合创建高扩展和高并发应用程序的框架之一。同时Vertx也提供了API网关解决方案,即Vertx网关。本文将详细介绍Vertx网关,…

    编程 2025-04-28
  • Elasticsearch API使用用法介绍-get /_cat/allocation

    Elasticsearch是一个分布式的开源搜索和分析引擎,支持全文检索和数据分析,并且可伸缩到上百个节点,处理PB级结构化或非结构化数据。get /_cat/allocation…

    编程 2025-04-28
  • 解析Azkaban API Flow执行结果

    本文将从多个方面对Azkaban API Flow执行结果进行详细阐述 一、Flow执行结果的返回值 在调用Azkaban API的时候,我们一般都会通过HTTP请求获取Flow执…

    编程 2025-04-27
  • 高德拾取——地图API中的强大工具

    一、高德拾取介绍 高德拾取是高德地图API中的一项重要工具,它可以帮助开发者在地图上快速选择经纬度点,并提供多种方式来获取这些点的信息,例如批量获取坐标的地理位置、测量两个或多个点…

    编程 2025-04-25
  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • Resetful API的详细阐述

    一、Resetful API简介 Resetful(REpresentational State Transfer)是一种基于HTTP协议的Web API设计风格,它是一种轻量级的…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25

发表回复

登录后才能评论