springboot分组校验

news2024/11/16 11:59:19

1、分组校验场景

        主要2个场景,场景1:多个接口使用相同的入参,不同接口需要校验的内容不同。场景2:针对同一个接口,某个值(一般是类型)的不同会影响其他值的内容,此时需要根据某个值的内容来做不通的校验。

场景1(不同接口,相同入参,不同接口校验不同的内容)

入参类:

@Data
public class StudentReq {
    @NotNull(message = "id不能为空", groups = StudentValidator.Update.class)
    private String id;

    @NotNull(message = "性别不能为空", groups = StudentValidator.Insert.class)
    private String sex;

    private String project;
}

校验标识类

public class StudentValidator {
    public interface Insert{
    }

    public interface Update{
    }
}

2个接口

    /**
     * 通过接口实现不同的校验(接口维度)
     */
    @PostMapping("/test/validate/insert")
    public String insert(@RequestBody @Validated(StudentValidator.Insert.class) StudentReq studentReq) {
        return "insert";
    }

     /**
      * 通过接口实现不同的校验(接口维度)
      */
    @PostMapping("/test/validate/update")
    public String update(@RequestBody @Validated(StudentValidator.Update.class) StudentReq studentReq) {
        return "update";
    }

接口insert和update的入参都是StudentReq,其中的字段id和sex分别被注解StudentValidator.Update.class和StudentValidator.Insert.class表示,同时接口层面也使用了注解标识。则接口会校验被标识的字段。

运行结果

insert接口:

 update接口

场景2(入参的某值不同导致校验其他值的逻辑变化)

入参:

@Data
@GroupSequenceProvider(StudentWorkValidateProvider.class)
public class StudentWorkReq {
    @NotNull(message = "数学竞赛证书不能为空", groups = StudentWorkValidator.Math.class)
    private String mathCertificate;

    @NotNull(message = "计算机证书不能为空", groups = StudentWorkValidator.Computer.class)
    private String computerCertificate;

    private String project;
}

校验标识类

public class StudentWorkValidator {
    public interface Math{
    }

    public interface Computer{
    }
}

校验序列类:如果参数studentWorkReq的值是math时,则mathCertification不能为空。如果取值是computer,则computerCertification不能为空

public class StudentWorkValidateProvider implements DefaultGroupSequenceProvider<StudentWorkReq> {
    @Override
    public List<Class<?>> getValidationGroups(StudentWorkReq studentWorkReq) {
        List<Class<?>> defaultGroupSequence = new ArrayList<>();
        defaultGroupSequence.add(StudentWorkReq.class);
        if (Objects.isNull(studentWorkReq)) {
            return defaultGroupSequence;
        }

        if (studentWorkReq.getProject().equals("math")) {
            defaultGroupSequence.add(StudentWorkValidator.Math.class);
        } else if (studentWorkReq.getProject().equals("computer")) {
            defaultGroupSequence.add(StudentWorkValidator.Computer.class);
        }
        return defaultGroupSequence;
    }
}

接口

    /**
     * 通过接口参数实现不同的校验(参数维度)
     */
    @PostMapping("/work/validate/update")
    public String work(@RequestBody @Validated StudentWorkReq studentWorkReq) {
        return "work";
    }

运行结果

project传值math,mathCertification为空,则校验如下

 project传值computer,computerCertification为空,则校验如下

3、小结

2种场景,接口维度做不通校验和按照某个入参值(比如类型、类别能具有可列举属性的值)维度做不通校验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】设置 命令 --help 帮助文件为中文

&#x1f341;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; 文章目录 前言设置系统默认语言为中文安装man-…

【C#】并行编程实战:使用 PLINQ(2)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的合并选项以及抛出和处理异常。 本教程对应学习工程&…

Xshell连接不上虚拟机的解决办法(给他最后一次机会)

VM还原默认设置 如果你之前的操作都没问题的话Xshell还是连接不上我们的虚拟机&#xff0c;可以试试这个方法 点VM中的 编辑–>虚拟网络编辑器–还原默认设置**(这个方法也特别有效)** 注意还原好以后我们主要看一下VM8的 这是没还原之前的NAT设置 没还原之前的DHCP设置…

如何在Windows 10中创建引导到UEFI固件设置的快捷方式

大多数计算机都有一个特定的键,当计算机启动时按下该键,用户可以访问UEFI(固件)设置。然而,我们经常在错过给定的时间段时按键太晚,因为笔记本电脑默认情况下只需等待几秒钟就可以启动到 Windows。 另一个引导到 UEFI 设置的选项是重新启动到高级启动选项,然后从那里开…

centos6.X防火墙110.42.2

防火墙机制介绍122.228.84 Centos5.X 6.X的防火墙机制为什么称为iptables呢&#xff1f; 因为这个防火墙软件里面有多个表格&#xff08;table&#xff09;,每个表格都定义自己的默认策略与规则&#xff0c;且每个表用途都不同。 Centos5.X 6.X 主要表格&#xff08;table&am…

第三课:设计小技巧

前期准备 下载一份官方规范&#xff0c;将官方规范文件置入到 Figma 中&#xff0c;若是使用网页版&#xff0c;建议打开两个 Figma 网页&#xff0c;在两个网页中分别打开规范文档和需要设计的项目&#xff0c;这样便可以通过 Tab 切换&#xff0c;快速将官方文档中的文件复…

学习c++ Part03

文章目录 前言1.动态空间申请1.1 静态空间申请1.2 动态分配 2.字符串处理函数3.结构体3.1 结构体的浅拷贝3.2 结构体的深拷贝3.3 结构体变量在堆区 结构体指针成员也指向堆区&#xff08;先释放成员&#xff0c;再释放结构体&#xff09;3.4 结构体的对齐规则3.5 结构体的位域&…

跟我一起从零开始学python(三)多线程/多进程/协程

前言 回顾之前讲了python语法编程 &#xff0c;关于从零入门python的第一遍&#xff0c;编程语法必修内容&#xff0c;比如python3基础入门&#xff0c;列表与元组&#xff0c;字符串&#xff0c;字典&#xff0c;条件丶循环和其他语句丶函数丶面向对象丶异常和文件处理和网络…

oracle,update更新时,条件没走索引

update更新时没走索引&#xff0c; 查询索引是有效的&#xff1a; 没走索引的原因是条件字段的字段类型不一致&#xff0c; 一个是varchar2&#xff0c; 另一个是 nvarchar2 。 要走索引需要字段类型一致&#xff0c;可以利用to_char()将 nvarchar2转为 varchar2

VS2019+Qt5.15 在线显示百度地图

1.Qt5.15编译程序需要选择mscv2019 Release版本 2.需要到百度地图开发平台注册并获取到开发者key 3.显示地图是JS与Qt的交互过程&#xff0c;显示地图的html文件&#xff1a; <!DOCTYPE html> <html><head> <meta name"viewport" content&q…

订单自动取消的11种实现方式(上)

一、DelayQueue DelayQueue是JDK提供的api&#xff0c;是一个延迟队列 DelayQueue泛型参数得实现Delayed接口&#xff0c;Delayed继承了Comparable接口。 getDelay方法返回这个任务还剩多久时间可以执行&#xff0c;小于0的时候说明可以这个延迟任务到了执行的时间了。 com…

企业微信小程序登录,错误码:60020

在使用企业微信wx.qy.login API进行登录获取【session_key】时&#xff0c;报出错误码&#xff1a;60020 此错误记得好像意指的是获取的企业【access_token】用以去置换登录令牌【session_key】时&#xff0c;下发【access_token】的IP地址和获取【session_key】的IP不一致&am…

kotlin Flow系列之 - 冷流SafeFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列&#xff08;一&#xff09;之读懂Channel每一行源码 kotlin Flow系列之-冷流SafeFlow源码解析之 - Safe在那里&#xff1f; ko…

【vue2动画效果】实现两组单词逐渐减短,最后只保留首字母的效果

前言 实现两组单词逐渐减短&#xff0c;最后只保留首字母的效果 效果&#xff1a; 正文 <template><div class"header"><div style"margin-right: 12px; display: inline-flex"><divclass"door"id"book1"v-f…

常用数据回归建模算法总结记录

本文的主要目的是总结记录日常学习工作中常用到的一些数据回归拟合算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 (1)线性回归 (Linear Regressio…

解决springboot上传中文文件报错:NoClassDefFoundError: javax/mail/internet/MimeUtility

解决springboot上传中文文件报错:NoClassDefFoundError: javax/mail/internet/MimeUtility 1. 背景&#xff1a; springboot版本&#xff1a;2.7.11 前端使用 UnityEngine.WWWForm 进行文件上传 报错信息&#xff1a;org.springframework.web.multipart.MultipartException: F…

【资料分享】RK3568开发板规格书(4x ARM Cortex-A55(64bit),主频1.8GHz)

1 开发板简介 创龙科技TL3568-EVM是一款基于瑞芯微RK3568J/RK3568B2处理器设计的四核ARM Cortex-A55国产工业评估板&#xff0c;每核主频高达1.8GHz/2.0GHz&#xff0c;由核心板和评估底板组成。核心板CPU、ROM、RAM、电源、晶振、连接器等所有器件均采用国产工业级方案&#…

【拼多多API商品详情页面采集】具体的API接口调用步骤

要从拼多多获取商品数据&#xff0c;可以使用拼多多提供的API接口。首先需要注册一个拼多多开放平台的开发者账号&#xff0c;然后创建一个应用程序&#xff0c;获取应用程序的app_id和app_secret&#xff0c;以在API请求中进行身份验证。 在使用API接口时&#xff0c;需要按照…

力扣1816. 截断句子

代码展示&#xff1a; 方法1&#xff1a;通过StringBuilder创建的变量str来记录截断得到的字符串 思路&#xff1a;遍历字符串s&#xff0c;定义一个变量count_space来记录空格出现的次数&#xff0c;当空格没有出现k次时便将字符依次连接到StringBuilder类型的变量str后&#…

Web跳转案例、表单案例

一、跳转案例 <img>&#xff1a;html元素将图像嵌入文档 <body> <img src"../images(1)/images/7.5-1.jpg"> </body> 使用a标签进行一个跳转链接 <!DOCTYPE html> <html lang"en"> <head> <meta charset&qu…