【SpringBoot3】Spring 请求处理流程,自定义返回类型处理(HttpMessageConverter)

news2024/10/7 4:25:43

一、Spring Boot 请求处理

1、请求处理流程

Spring Boot 的接口请求处理流程主要基于 Spring MVC 架构,以下是详细的请求处理流程:

  1. 客户端发送请求:客户端发送HTTP请求到Spring Boot应用的URL。

  2. DispatcherServlet 接收请求:Spring Boot应用中的DispatcherServlet拦截所有的请求。

  3. HandlerMapping 进行映射:DispatcherServlet 通过 HandlerMapping 找到处理请求的 Controller。

  4. Controller 方法处理请求:Controller 中的相应方法处理请求,并调用适当的业务逻辑,返回数据或者视图名。

  5. 数据绑定与验证:如果请求中包含数据,Spring Boot 将数据绑定到相应的参数上,并执行验证(如果有的话),验证失败会产生相应的错误。

  6. 调用 Service 层:Controller 方法通常会调用 Service 层的方法来执行业务逻辑。

  7. 返回数据或视图:Controller 方法处理完请求后,返回数据或者视图名给 DispatcherServlet。

  8. ViewResolver 解析视图:如果返回的是视图名,DispatcherServlet 会使用 ViewResolver 来解析视图名,得到具体的视图对象。

  9. 视图渲染:视图对象将模型数据填充到视图中,生成最终的响应结果。

  10. 响应返回给客户端:DispatcherServlet 将最终的响应返回给客户端,请求处理完成。

需要注意的是,Spring Boot 的自动配置大大简化了这个流程,大部分情况下,开发者只需要专注于编写 Controller 和相应的业务逻辑,其他的请求处理流程由 Spring Boot 自动完成。

2、处理请求的相关注解

在Spring Boot中,用于处理请求的相关注解包括但不限于以下几种:

  1. @Controller:用于标识控制器类,处理HTTP请求。

  2. @RestController:类似于@Controller,但是其方法默认返回JSON格式的数据,常用于构建RESTful风格的服务。

  3. @RequestMapping:用于映射HTTP请求到控制器的处理方法,并可以定义请求的URL路径、HTTP方法等。

  4. @GetMapping@PostMapping@PutMapping@DeleteMapping:这些注解分别用于标识处理GET、POST、PUT、DELETE请求的方法,并可以指定URL路径。

  5. @RequestParam:用于从请求中获取参数值,常用于处理HTTP请求中的查询参数。

  6. @PathVariable:用于从URL路径中获取参数值,常用于RESTful风格的请求。

  7. @RequestBody:用于将请求体中的数据绑定到方法的参数上,常用于处理POST请求中的请求体数据。

  8. @ResponseBody:用于将方法的返回值直接作为HTTP响应体返回给客户端。

  9. @ModelAttribute:用于将请求参数绑定到一个对象上,并将该对象添加到模型中传递给视图。

  10. @Valid@Validated:用于执行Bean验证,通常与JSR-303/JSR-380规范的验证注解一起使用。

  11. @ExceptionHandler:用于捕获处理方法中抛出的异常,可以定义全局异常处理方法或特定异常的处理方法。

  12. @ControllerAdvice:用于定义全局控制器的建言(增强)类,可以在其中定义全局异常处理方法、全局数据绑定等。

这些注解是Spring Boot中处理请求时最常用的注解,通过它们可以方便地定义控制器类和处理方法,并实现与请求相关的业务逻辑。

3、序列化与反序列化

Http请求处理流程实际上就是数据的序列化与反序列化的过程,如下图所示:

在这里插入图片描述

二、自定义返回类型处理(HttpMessageConverter)

下面以自定Excel文件下载为例,自定义请求处理类 XlsHttpMessageConverter

1、新建返回类型 XlsResult

@Data
public class XlsResult<T> {
    // 文件名称
    private String filename;
    // 表格 sheet名称
    private String sheetName;
    // 数据列表
    private List<T> data;
    // 数据类型
    private Class<T> type;
}

1、新建自定义返回类型处理器 XlsHttpMessageConverter

1)XlsHttpMessageConverter 继承 AbstractHttpMessageConverter,并传入返回值泛型 XlsResult
2)实现构造函数,传入Excel媒体类型
3)实现supports方法,判断返回类型
4)实现writeInternal写入数据方法,使用EasyExcel写入数据到输出流
5)添加注解@Component,会在AbstractMessageConverterMethodProcessor#messageConverters列表的第一个位置添加该自定义处理类XlsHttpMessageConverter

@Component
public class XlsHttpMessageConverter extends AbstractHttpMessageConverter<XlsResult<Object>> {
    private static final MediaType mediaType = MediaType.valueOf("application/vnd.ms-excel;charset=UTF-8");

    public XlsHttpMessageConverter() {
        super(mediaType);
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        return clazz == XlsResult.class;
    }

    @Override
    protected XlsResult<Object> readInternal(Class<? extends XlsResult<Object>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }

    @Override
    protected void writeInternal(XlsResult<Object> objectXlsResult, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {

        EasyExcel.write(outputMessage.getBody(), objectXlsResult.getType())
                .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
                .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
                .sheet(objectXlsResult.getSheetName()).doWrite(objectXlsResult.getData());
    }
}

2、添加Controller 请求方法,并注明 produces

这里以导出用户数据为例。

1)从数据库中查询用户数据列表
2)返回类型 XlsResult<UserRespVO>
3)设置 produces = {"application/vnd.ms-excel"}

在请求返回时,AbstractHttpMessageConverter.canWrite 同时判断了 supportsmediaType

public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
	return supports(clazz) && canWrite(mediaType);
}
@GetMapping(value = "/exportList", produces = {"application/vnd.ms-excel"})
@Operation(summary = "导出用户")
public XlsResult<UserRespVO> exportList(@Validated UserPageReqVO exportReqVO,
                                        HttpServletResponse response) {
    XlsResult<UserRespVO> xlsResult = new XlsResult<>();
    xlsResult.setFilename("用户数据.xls");
    xlsResult.setSheetName("用户列表");
    xlsResult.setType(UserRespVO.class);
    exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
    // 从数据库查询用户列表
    List<UserRespVO> list = userService.getUserPage(exportReqVO).getList();
    xlsResult.setData(UserConvert.INSTANCE.convertList(list, deptMap));
    return xlsResult;
}

3、发送测试请求

打开 Postman,点击 Send and Download

如果出现文件下载框,说明处理正常!

在这里插入图片描述

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

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

相关文章

《C程序设计》上机实验报告(五)之一维数组二维数组与字符数组

实验内容&#xff1a; 1.运行程序 #include <stdio.h> void main( ) { int i,j,iRow0,iCol0,m; int x[3][4]{{1,11,22,33},{2,28,98,38},{3,85,20,89}}; mx[0][0]; for(i0;i<3;i) for(j0;j<4;j) if (x[i][j]>m) { mx[i][j]; iRowi…

QT学习日记 | 信号与槽

目录 前言 一、初始信号与槽 1、信号与槽的本质 2、信号与槽的使用 3、内置信号、内置槽函数与自定义信号、自定义槽函数 &#xff08;1&#xff09;文档查询 &#xff08;2&#xff09;自定义信号与内置槽函数的使用 4、信号与槽函数关联关系 5、带参数的信号与槽函数…

17- OpenCV:图像矩(Image Moments)和点多边形测试

目录 一、图像矩 1、矩的概念介绍 2、相关的API 3、代码演示 二、点多边形测试 1、概念介绍-点多边形测试 2、cv::pointPolygonTest 3、代码演示 一、图像矩 引言 在数字图像处理、计算机视觉与相关领域中&#xff0c;图像矩(Image moments)是指图像的某些特定像素灰…

如何搭建良好的软件测试环境?有什么作用?

在软件开发过程中&#xff0c;测试环境是非常重要的一环。它为软件测试提供了一个模拟真实生产环境的平台&#xff0c;以确保软件的质量和稳定性。那么如何搭建良好的测试环境呢?测试环境又有什么作用呢?卓码软件测评小编将进行以下解答。 软件测试环境是指在软件测试过程中…

Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二

Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作&#xff0c;更详细信息自己看上面链接。 我电脑的硬盘是mbr格式&#xff0c;而且没有划分恢复分区。 Microsoft Windo…

HDFS HA 之 HA 原理

1 ZKFC解析 HA(High Availability)是HDFS支持的一个重要特性,可以有效解决Active Namenode遇到故障时,将可用的Standby节点变成新的Active状态的问题,使集群能够正常工作。目前支持冷切换和热切换两种方式。冷切换通过手动触发,缺点是不能够及时恢复集群。实际生产中以应用…

【数据结构与算法】之排序系列-20240201

【数据结构与算法】之排序系列-20240201 一、88. 合并两个有序数组二、169. 多数元素三、217. 存在重复元素四、242. 有效的字母异位词五、268. 丢失的数字六、349. 两个数组的交集七、350. 两个数组的交集 II 一、88. 合并两个有序数组 简单 给你两个按 非递减顺序 排列的整数…

Linux网络状态查看与防火墙管理

网络状态查看 netstat [选项] Netstat是一款命令行工具&#xff0c;用于显示Linux系统中网络的状态信息&#xff0c;可以显示网络连接、路由表、连接的数据统计等信息。 使用 选项 -a&#xff1a;显示所有选项&#xff0c;包括监听和未监听的端口。 -t&#xff1a;仅显示tc…

C++(17)——list的模拟实现

前面的文章中&#xff0c;介绍了&#xff0c;的模拟实现&#xff0c;本篇文章将介绍对于的模拟实现。 目录 1. list的基本结构&#xff1a; 2. list功能实现&#xff1a;尾部插入元素&#xff1a; 3. list迭代器的实现&#xff1a; 4. list功能实现&#xff1a;在任意位置前…

从零开始训练 RT-DETR模型最新版本教程说明(包含Mac、Windows、Linux端 )同之前的项目版本代码有区别

从零开始训练 RT-DETR- 最新8.1版本教程说明 本文适用Windows/Linux/Mac:从零开始使用Windows/Linux/Mac训练 RT-DETR 算法项目 《芒果 RT-DETR 目标检测算法 改进》 适用于芒果专栏改进 RT-DETR 算法 文章目录 U版 RT-DETR 算法第一步 配置环境1.1 系列配置1.2 代码执行第…

react-virtualized实现行元素不等高的虚拟列表滚动

前言&#xff1a; 当一个页面中需要接受接口返回的全部数据进行页面渲染时间&#xff0c;如果数据量比较庞大&#xff0c;前端在渲染dom的过程中需要花费时间&#xff0c;造成页面经常出现卡顿现象。 需求&#xff1a;通过虚拟加载&#xff0c;优化页面渲染速度 优点&#xff1…

探索组合模式的魅力:探索树形结构的艺术与科学

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时&#xff0c;我们如何优雅地处理单个对象与组合对象的一致性问题&#xff1f;组合模式&#xff08;Composite Pattern&#xff09;为此提供了一种简洁高效的解决方案。通过本…

网络协议 UDP协议

网络协议 UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解&#xff0c;本文主要对UDP协议进行一些理论补充。 文章目录 网络协议 UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP&#xff0c;即User Datagram P…

[office] excel2010双向条形图制作 #经验分享#微信

excel2010双向条形图制作 本教程为大家介绍一下excel2010中excel2010双向条形图制作方法。 1.选中工作区域 2.点击插入-->图表,选择条形图 3.为美观可将中间竖线可去掉 4.方法是选中竖线,右击-->删除 5.接下来将图例靠上,选中图例,右击-->设置图例格式-->图例选项…

排序算法-选择/堆排序(C语言)

1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 数据元素排完 。 2 直接选择排序: 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素…

【C/C++ 07】词频统计

一、题目 读入一篇英文短文&#xff0c;去除介词、连词、冠词、副词、代词等非关键性单词后&#xff0c;统计每个单词出现的次数&#xff0c;并将单词按出现次数的降序和单词字符的升序进行显示5个单词。 二、算法 1. 通过<fstream>库创建fstream流对象&#xff0c;并从…

数学建模 - 线性规划入门:Gurobi + python

在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中&#xff0c;人们常常会遇到各种优化问题。例如&#xff0c;在生产经营中&#xff0c;我们总是希望制定最优的生产计划&#xff0c;充分利用已有的人力、物力资源&#xff0c;获得最大的经济效益&#…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包&#xff08;thin jar&#xff09;2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手&#xff1f;总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

【网络】端口号范围

一、端口号的几个范围 在计算机网络中&#xff0c;一个端口号是一个16位的无符号整数&#xff0c;意味着端口号的范围是从0到65535。不过&#xff0c;并非所有端口都可以随意使用。根据惯例和技术标准&#xff0c;端口号被分为几个范围&#xff1a;1. 系统或保留端口&#xff…

草图导入3d后模型贴材质的步骤?---模大狮模型网

3D模型在导入草图大师后出现混乱可能有多种原因&#xff0c;以下是一些可能的原因和解决方法&#xff1a; 模型尺寸问题&#xff1a;如果3D模型的尺寸在导入草图大师时与画布尺寸不匹配&#xff0c;可能导致模型混乱。解决方法是在3D建模软件中调整模型的尺寸&#xff0c;使其适…