嵌套组合请求对象的校验与全局捕捉

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页:码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

  • 嵌套组合请求对象的校验与全局捕捉
      • 引言
      • 1. 请求对象的定义与校验
        • 1.1 定义`FlowClientReserveListReq`
        • 1.2 定义`FlowControlReserveUpdateReq`
      • 2. 控制器中使用验证
      • 3. 全局异常处理
      • 4. 详细步骤总结
      • 结论

嵌套组合请求对象的校验与全局捕捉

引言

在现代Web开发中,确保请求数据的有效性是至关重要的,尤其是在处理复杂的嵌套组合请求对象时。本文将详细介绍如何在Spring Boot中进行嵌套组合请求对象的校验,并通过全局异常处理机制捕捉和处理验证错误,确保应用的健壮性和数据的完整性。

1. 请求对象的定义与校验

首先,我们定义了两个请求对象:FlowClientReserveListReqFlowControlReserveUpdateReq。其中FlowClientReserveListReq嵌套在FlowControlReserveUpdateReq中,形成复杂的嵌套组合请求对象。

1.1 定义FlowClientReserveListReq
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class FlowClientReserveListReq {

    @NotNull(message = "流量客户端Id不能为空")
    @ApiModelProperty(required = true, value = "流量客户端Id")
    private Long flowAppId;

    @NotNull(message = "渠道广告位Id不能为空")
    @ApiModelProperty(required = true, value = "媒体广告位Id")
    private Long channelAdId;

    @ApiModelProperty(value = "倍数")
    private Integer times;

    @Min(value = 0, message = "放量数量必须大于或等于零")
    @ApiModelProperty(value = "百分比")
    private Integer percent;

    private Long agentId;
}
1.2 定义FlowControlReserveUpdateReq
package com.middle.bean.req.flow.control;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;

@Data
public class FlowControlReserveUpdateReq {

    @NotNull(message = "编号Id不能为空")
    @ApiModelProperty(required = true, value = "编号Id")
    private Long id;

    @Range(min = 1, max = 100, message = "点击率必须大于等于1,小于等于100")
    @NotNull(message = "点击率不能为空")
    @ApiModelProperty(required = true, value = "点击率")
    private Integer clickRate;

    @Valid
    @ApiModelProperty(value = "流量客户端列表")
    private List<FlowClientReserveListReq> clientListReqs;

    @NotBlank(message = "操作人不能为空")
    @ApiModelProperty(required = true, value = "操作人")
    private String opUser;

    @NotNull(message = "代理商id不能为空")
    @ApiModelProperty(value = "代理商ID", required = true)
    private Long agentId;

    private List<Long> channelAdIds;
}

2. 控制器中使用验证

在Spring Boot的控制器中,我们可以使用@Valid注解来触发对请求对象的校验。下面是一个示例:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/api")
public class FlowControlReserveController {

    @PostMapping("/reserve/update")
    public String updateFlowControlReserve(@Valid @RequestBody FlowControlReserveUpdateReq request) {
        // 处理请求逻辑
        return "Flow control reserve updated successfully";
    }
}

3. 全局异常处理

为了更好地处理验证错误,通常会使用全局异常处理器来捕获和处理这些异常。以下是一个示例:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> 
            errors.put(error.getField(), error.getDefaultMessage()));
        return ResponseEntity.badRequest().body(errors);
    }
}

4. 详细步骤总结

  1. 定义嵌套组合请求对象

    • 创建FlowClientReserveListReq类,添加必要的验证注解,如@NotNull@Min
    • 创建FlowControlReserveUpdateReq类,包含FlowClientReserveListReq对象的列表,并在字段上使用@Valid注解。
  2. 控制器中启用验证

    • 在控制器方法中,使用@Valid注解修饰请求参数,确保传入的对象满足验证规则。
  3. 全局异常处理

    • 创建全局异常处理器类,使用@ControllerAdvice@ExceptionHandler注解,捕获并处理MethodArgumentNotValidException,返回详细的错误信息。

结论

通过以上步骤,我们实现了对嵌套组合请求对象的校验,并通过全局异常处理机制捕捉和处理验证错误。这种方式不仅提高了数据的完整性和应用的健壮性,还使得代码更加简洁和可维护。在实际开发中,合理使用这些技术,可以大大提升开发效率和用户体验。

希望本文能够帮助你更好地理解和实现嵌套组合请求对象的校验与全局捕捉。如果你有任何疑问或建议,欢迎在评论区讨论。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么压缩图片大小?6种无需牺牲质量的图片压缩方法

经常处理图片的小伙伴都知道&#xff0c;高质量的图片往往会占据电脑大量的存储空间&#xff0c;导致图片传输及存储的不便。因此&#xff0c;掌握如何压缩图片大小变得尤为重要。本文将详细介绍图片压缩的几种方法&#xff0c;帮助你高效地减小图片文件大小&#xff0c;让你的…

【ACM出版,马来西亚-吉隆坡举行】第四届互联网技术与教育信息化国际会议 (ITEI 2024)

作为全球科技创新大趋势的引领者&#xff0c;中国不断营造更加开放的科技创新环境&#xff0c;不断提升学术合作的深度和广度&#xff0c;构建惠及各方的创新共同体。这是对全球化的新贡献&#xff0c;是构建人类命运共同体的新贡献。 第四届互联网技术与教育信息化国际学术会议…

秒懂设计模式--学习笔记(5)【创建篇-抽象工厂】

目录 4、抽象工厂4.1 介绍4.2 品牌与系列&#xff08;针对工厂泛滥&#xff09;(**分类**)4.3 产品规划&#xff08;**数据模型**&#xff09;4.4 生产线规划&#xff08;**工厂类**&#xff09;4.5 分而治之4.6 抽象工厂模式的各角色定义如下4.7 基于此抽象工厂模式以品牌与系…

本地文本向量模型的部署提供兼容openai的接口

前言 之前部署了fastgpt官方文档的一个,提供的一个m3e-large的向量模型打包的docker镜像,虽然使用起来整体效果还可以,但是有些文本向量相似度匹配的结果还是不太满意的,目前,网络上层出不穷的带推理文本向量,想体验一下,于是我基于modelscope库封装了一个兼容open ai的…

有哪些Python书籍是程序员强烈推荐?

有一本升级版的经典Python项目编程书一定要推荐一下。 Python极客项目编程&#xff08;第2版&#xff09; 第一版累计销售19万册&#xff0c;豆瓣评分8.4。每个项目都按照【讲解原理-分析需求-代码精讲-知识小结-扩展练习-完整代码】的方式进行讲解&#xff0c;并提供可下载运…

【文档+源码+调试讲解】科研经费管理系统

目 录 目 录 摘 要 ABSTRACT 1 绪论 1.1 课题背景 1.2 研究现状 1.3 研究内容 2 系统开发环境 2.1 vue技术 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 2.5 SSM框架技术 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3 经济可行性 3.1…

实习总结 --- 内部平台使用

常用术语 CR CR–标准问题分类管理平台&#xff1a;由业务类型-角色-国家-品类-Page定义。 FAQSOP FAQ是端上用户自助的第一道关口&#xff0c;在引导用户进行自助解决上起关键作用 SOP是指标准作业程序&#xff0c;客服SOP是针对用户遇到的具体问题场景&#xff0c;给客服…

论文阅读【时间序列】DSformer

论文阅读【时间序列】DSformer arxive: DSformer: A Double Sampling Transformer for Multivariate Time Series Long-term Prediction github: MTST 分类&#xff1a;多变量时间序列&#xff08;Multivariate time series&#xff09; 核心观点 多变量时间序列3个维度信息 …

从零开始实现大语言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我现在在做大语言模型相关工作&#xff0c;我用业余时间写一个专栏&#xff0c;给大家讲讲如何从零开始实现大语言模型。 从零开始实现大语言模型是了解其原理及领域大语言模型实现路径的最好方法&#xff0c;没有之一。已有研究证明&…

ArcGIS中将测绘数据投影坐标(平面坐标)转地理坐标(球面经纬度坐标)

目录 前言1.测绘数据预览1.1 确定带号1.2 为什么是对Y轴分带&#xff0c;而不是对X轴分带&#xff1f; 2 测绘数据转shp2.1 添加数据2.2 显示XY数据2.3 添加经纬度字段2.4 计算经纬度 3.shp数据重投影4.总结 前言 最近在刚好在做一个小功能&#xff0c;将测绘数据转为经纬度坐标…

一些硬件知识(十二)

X电容是接在火线和零线之间&#xff0c;Y电容是接在火零线和地之间。X电容滤除差模干扰&#xff0c;Y电容滤除共模干扰&#xff1a; 高频干扰信号经过X电容后幅度没有变化&#xff0c;相位相差180度&#xff1a; DW01电池管理芯片&#xff1a; M1、M2&#xff1a;这两个为N沟道…

BMA530 运动传感器

型号简介 BMA530是博世&#xff08;bosch-sensortec&#xff09;的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器&#xff08;1.2 x 0.8 x 0.55 mm&#xff09;。它专为紧凑型设备而设计&…

本地项目推送到gitlab仓库的保姆级教程

目录 1、安装git &#xff08;1&#xff09;Windows系统 &#xff08;2&#xff09;Linux系统 2、gitlab创建空白项目 3、创建密钥 4、将密钥添加到gitlab中 5、远程配置 &#xff08;1&#xff09;配置全局的用户和邮箱 &#xff08;2&#xff09;本地文件夹初始化 …

【代码随想录】【算法训练营】【第52天】 [647]回文子串 [516]最长回文子序列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 52&#xff0c;周五&#xff0c;开始补作业了~ 题目详情 [647] 回文子串 题目描述 647 回文子串 解题思路 前提&#xff1a;寻找回文子串&#xff0c;子串意味着元素连续 思路&#xff1a;…

Python-Tkinter+Logging+Sqlserver项目结合

参考文章&#xff1a; https://www.jb51.net/article/283745.htm 目录&#xff1a; common(文件夹) – base.py – config_reader.py – dosqlserver.py – log.py txt&#xff08;空文件夹&#xff0c;后面会自动生成txt文件在该文件夹下面&#xff09; 1.txt 2.txt env.…

非平稳信号的时频表示-基于本征模态函数(MATLAB)

时频分析思想萌芽于匈牙利物理学家 Gabor 在 1946 年所提出的 Gabor 展开理论&#xff0c;随后以此为基础发展出著名的线性时频变换方法—短时傅里叶变换。短时傅里叶变换假设分析信号在有限时长内具有平稳特性&#xff0c;它首先将时间与频率均为有限支撑的窗函数与分析信号进…

973. 最接近原点的 K 个点-k数组维护+二分查找

973. 最接近原点的 K 个点-k数组维护二分查找 给定一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点&#xff0c;并且是一个整数 k &#xff0c;返回离原点 (0,0) 最近的 k 个点。 这里&#xff0c;平面上两点之间的距离是 欧几里德距离&#…

Linux修炼之路之进程概念,fork函数,进程状态

目录 一&#xff1a;进程概念 二&#xff1a;Linux中的进程概念 三&#xff1a;用getpid(),getppid()获取该进程的PID,PPID 四&#xff1a;用fork()来创建子进程 五&#xff1a;操作系统学科的进程状态 六&#xff1a;Linux中的进程状态 接下来的日子会顺顺利利&#xf…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

crewAI实践过程中,memory规避openai的使用方法以及(windows下xinferece框架使用踩过的坑)

问题&#xff1a; 在使用crewAI开发项目的过程中&#xff0c;memory开启后报错&#xff1a;openai key is fake 经代码核查&#xff0c;其默认使用了openai的embedding模型。 解决方法 经查阅资料&#xff0c;可以参考其本地部署llm的方法。 本地部署模型可以使用xinference…