Spring Boot 中 @RequestParam 和 @RequestPart 的区别详解(含实际项目案例)

news2026/3/2 1:08:35

Spring Boot 中 @RequestParam 和 @RequestPart 的区别详解(含实际项目案例)

在日常的 Spring Boot 开发中,我们经常会遇到表单提交、文件上传、JSON 参数绑定等需求。而在处理这类请求时,两个常见的注解——@RequestParam@RequestPart——经常被用来接收前端传递的参数。

它们看似相似,但适用场景却有着本质区别。在本文中,我将结合我在项目中的两个真实场景,对这两个注解进行详细解析,希望能帮助你更好地理解并灵活运用它们。


一、先看基本概念

1. @RequestParam 是什么?

  • 用于接收表单中的简单参数,例如字符串、数字或单个文件等。
  • 支持 application/x-www-form-urlencodedmultipart/form-data 等常见的表单类型。
  • 可用于绑定 URL 查询参数或表单字段。
@PostMapping("/upload-mp3")
public String upload(@RequestParam("file") MultipartFile file) {
    // 处理单个文件上传
}

2. @RequestPart 是什么?

  • 专门用于处理 multipart/form-data 类型的请求。
  • 常用于接收复杂结构的数据(例如 JSON + 文件)。
  • 支持将 part 中的 JSON 自动转换为 Java 对象。
@PostMapping("/create-prize")
public String createPrize(@RequestPart("param") PrizeParam param,
                          @RequestPart("pic") MultipartFile picFile) {
    // 同时处理 JSON 参数和文件上传
}

二、结合项目实战场景

✅ 场景一:上传 MP3 文件 —— 使用 @RequestParam

在我的项目中有一个上传音频的功能,用户只需上传一个 MP3 文件,不涉及其他参数。此时前端表单格式如下:

<form method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
</form>

后台接口使用的是 @RequestParam

@PostMapping("/music/upload")
public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {
    // 简单文件上传处理
    return ResponseEntity.ok("上传成功");
}

👉 这个场景中参数结构非常简单,使用 @RequestParam 是最自然的选择。


✅ 场景二:创建奖品 —— 使用 @RequestPart

在奖品管理模块中,用户需要上传两类数据:

  • 奖品的详细信息(如名称、数量、规则等):使用一个 JSON 对象提交;
  • 奖品的图片:作为文件上传。

前端以 multipart/form-data 格式提交这两个字段:

let formData = new FormData();
formData.append("param", new Blob([JSON.stringify(prizeParam)], { type: "application/json" }));
formData.append("prizePic", file);

后端控制器这样写:

@RequestMapping("/prize/create")
public CommonResult<Long> createPrize(@RequestPart("param") CreatePrizeParam param,
                                      @RequestPart("prizePic") MultipartFile picFile) {
    // 处理复杂 multipart 请求
    return CommonResult.success(prizeService.createPrize(param, picFile));
}

👉 由于传递的是JSON 对象 + 文件的复合结构,必须使用 @RequestPart,否则 JSON 无法被正常转换为 Java Bean。


三、总结:@RequestParam 与 @RequestPart 的区别

比较点@RequestParam@RequestPart
适用请求类型application/x-www-form-urlencodedmultipart/form-data
适用参数类型简单类型(字符串、文件、数字)复杂类型(JSON 对象、多个文件、嵌套结构)
JSON 自动转换❌ 不支持✅ 支持(通过 HttpMessageConverter)
常见使用场景普通表单提交、单文件上传JSON + 文件上传、富表单场景

四、面试回答建议

如果在面试中被问到这个问题,可以这样回答:

我在项目中有两个典型的场景分别用到了 @RequestParam@RequestPart。一个是上传 MP3 文件,仅需要上传一个文件,使用 @RequestParam 足够;另一个是创建奖品,需要同时上传一个 JSON 格式的奖品信息和一张图片,因此使用了 @RequestPart。因为 @RequestPart 支持将 multipart 请求中的 JSON 自动绑定到 Java 对象,这也是它比 @RequestParam 更适合处理复杂表单的原因。


五、写在最后

理解 @RequestParam@RequestPart 的使用场景,能够帮助我们在设计接口时做出更合适的技术选择,也能避免参数绑定错误、JSON 转换失败等常见问题。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我,一起深入学习 Spring Boot 的更多实用知识!


✍️ 作者:Lvzi
📅 时间:2025年
📌 标签:Spring Boot / 文件上传 / 参数绑定 / 面试经验分享


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

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

相关文章

Linux入门(十一)进程管理

Linux 中每个执行的程序都称为一个进程&#xff0c;每个进程都分配一个ID号&#xff08;PID&#xff09; 每个进程都可能以两种方式存在&#xff0c;前台&#xff08;屏幕上可以操作的&#xff09;和后台&#xff08;屏幕上无法看到的&#xff09;&#xff0c;一般系统的服务都…

【技能篇】RabbitMQ消息中间件面试专题

1. RabbitMQ 中的 broker 是指什么&#xff1f;cluster 又是指什么&#xff1f; 2. 什么是元数据&#xff1f;元数据分为哪些类型&#xff1f;包括哪些内容&#xff1f;与 cluster 相关的元数据有哪些&#xff1f;元数据是如何保存的&#xff1f;元数据在 cluster 中是如何分布…

Linux研学-环境搭建

一 概述 1 Linux 概述 Linux系统由内核、Shell、文件系统、应用程序及系统库等关键部分组成。内核作为核心&#xff0c;管理硬件资源与系统服务&#xff1b;Shell提供用户与系统交互的命令行界面&#xff0c;让用户能便捷执行操作&#xff1b;文件系统负责数据的存储、组织与管…

Ubuntu系统下可执行文件在桌面单击运行教程

目录 ​编辑 操作环境&#xff1a;这个可执行文件在原目录下还有它的依赖文件 1&#xff0c;方法1&#xff1a;创建启动脚本 操作步骤​&#xff1a; &#xff08;1&#xff09;​​在桌面创建脚本文件​​&#xff08;如 run_main_improve.sh&#xff09;&#xff1a; ​…

Linux之文件进程间通信信号

Linux之文件&进程间通信&信号 文件文件描述符文件操作重定向缓冲区一切皆文件的理解文件系统磁盘物理结构&块文件系统结构 软硬链接 进程间通信匿名管道命名管道system V共享内存 信号 文件 首先&#xff0c;Linux下一切皆文件。对于大量的文件&#xff0c;自然要…

代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法

图论 题目 97. 小明逛公园 本题是经典的多源最短路问题。 在这之前我们讲解过&#xff0c;dijkstra朴素版、dijkstra堆优化、Bellman算法、Bellman队列优化&#xff08;SPFA&#xff09; 都是单源最短路&#xff0c;即只能有一个起点。 而本题是多源最短路&#xff0c;即求多…

改写自己的浏览器插件工具 myChromeTools

1. 起因&#xff0c; 目的: 前面我写过&#xff0c; 自己的一个浏览器插件小工具 最近又增加一个小功能&#xff0c;可以自动滚动页面&#xff0c;尤其是对于那些瀑布流加载的网页。最新的代码都在这里 2. 先看效果 3. 过程: 代码 1, 模拟鼠标自然滚动 // 处理滚动控制逻辑…

python-pptx去除形状默认的阴影

文章目录 效果原理1. 阴影继承机制解析2. XML层操作细节3. 注意事项 扩展应用1. 批量去除阴影2. 复合效果控制 效果 右边这个是直接添加一个形状。可以看到它会默认被赋予一个阴影。 然而&#xff0c;这个东西在特定的场合&#xff0c;其实是我们所不需要的。 那怎么把这个阴…

kuboard自带ETCD存储满了处理方案

一、前言 当运行 ETCD 日志报 Erro: mvcc database space exceeded 时&#xff0c;说明 ETCD 存储不足了&#xff08;默认 ETCD 存储是 2G&#xff09;&#xff0c;配额会触发告警&#xff0c;然后 Etcd 系统将进入操作受限的维护模式。 通过下面命令可以查看 ETCD 存储使用情…

SpringBoot+tabula+pdfbox解析pdf中的段落和表格数据

一、前言 在日常业务需求中&#xff0c;往往会遇到解析pdf文件中的段落或者表格数据的需求。 常见的做法是使用 pdfbox 来做&#xff0c;但是它只能提取文本数据&#xff0c;没有我们在文件页面上面的那种结构化组织&#xff0c;文本通常是散乱的包含各种换行回车空格等格式&a…

GitHub push失败解决办法-fatal: unable to access ‘https://github.com/xxx

问题描述&#xff1a; 问题解决&#xff1a; 1、首先查找自己电脑的代理地址和端口 windows教程如下&#xff1a; 1、搜索控制面板-打开Internet选项 2、点击局域网设置&#xff1a; 3、如图为地址和端口号 即可获得本机地址和端口号 2、根据上一步获得的本机地址和端口号为…

电商平台 API、数据抓取与爬虫技术的区别及优势分析

一、技术定义与核心原理 电商平台 API&#xff08;应用程序编程接口&#xff09; 作为平台官方提供的标准化数据交互通道&#xff0c;API 通过 HTTP 协议实现不同系统间的结构化数据传输。开发者需申请授权&#xff08;如 API 密钥&#xff09;&#xff0c;按照文档规范调用接口…

单卡4090部署Qwen3-32B-AWQ(4bit量化)-vllm

单卡4090部署Qwen3-32B-AWQ(4bit量化) 模型&#xff1a;Qwen3-32B-AWQ(4bit量化) 显卡&#xff1a;4090 1 张 python版本 python 3.12 推理框架“vllm 重要包的版本 vllm0.9.0创建GPU云主机 这里我使用的是优云智算平台的GPU&#xff0c;使用链接可以看下面的 https://blog.…

漫画Android:Handler机制是怎么实现的?

线程之间通信会用到Handler&#xff0c;比如&#xff0c;在子线程中进行耗时的网络请求任务&#xff0c;子线程在获取到数据后&#xff0c;更新界面的时候就需要用到Handler&#xff1b; 子线程在获取到数据后&#xff0c;不直接去更新 界面&#xff0c;而是把数据通过一个消息…

多部手机连接同一wifi的ip一样吗?如何更改ip

通常情况下&#xff0c;多部手机连接同一个WiFi时&#xff0c;它们的IP地址是各不相同的&#xff08;在局域网内&#xff09;。但是&#xff0c;从互联网&#xff08;外网&#xff09;的角度看&#xff0c;它们共享同一个公网IP地址。让我详细解释一下&#xff0c;并说明如何更…

飞牛fnNAS的Docker应用之迅雷篇

目录 一、“迅雷”应用安装 二、启动迅雷 三、迅雷账号登录 四、修改“迅雷”下载保存路径 1、下载路径准备 2、停止“迅雷”Docker容器 3、修改存储位置 4、重新启动Docker容器 5、再次“启用”迅雷 五、测试 1、在PC上添加下载任务 2、手机上管理 3、手机添加下…

SQLMesh 用户定义变量详解:从全局到局部的全方位配置指南

SQLMesh 提供了灵活的多层级变量系统&#xff0c;支持从全局配置到模型局部作用域的变量定义。本文将详细介绍 SQLMesh 的四类用户定义变量&#xff08;global、gateway、blueprint 和 local&#xff09;以及宏函数的使用方法。 一、变量类型概述 SQLMesh 支持四种用户定义变量…

inviteflood:基于 UDP 的 SIP/SDP 洪水攻击工具!全参数详细教程!Kali Linux教程!

简介 一种通过 UDP/IP 执行 SIP/SDP INVITE 消息泛洪的工具。该工具已在 Linux Red Hat Fedora Core 4 平台&#xff08;奔腾 IV&#xff0c;2.5 GHz&#xff09;上测试&#xff0c;但预计该工具可在各种 Linux 发行版上成功构建和执行。 inviteflood 是一款专注于 SIP 协议攻…

Visual Studio 2022 设置自动换行

Visual Studio 2022 设置自动换行 一、在 Visual Studio 菜单栏上&#xff0c;选择 工具>选项二、选择“文本编辑器”>“所有语言”>“常规” 全局设置此选项。 一、在 Visual Studio 菜单栏上&#xff0c;选择 工具>选项 二、选择“文本编辑器”>“所有语言”&…

【Linux网络篇】:简单的TCP网络程序编写以及相关内容的扩展

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;Linux篇–CSDN博客 文章目录 一.简单的TCP网络程序相关接口代码实现服务器单进程版服务器多…