惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 三生石上(FineUI控件)
美团技术团队
Last Week in AI
Last Week in AI
WordPress大学
WordPress大学
L
LangChain Blog
雷峰网
雷峰网
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
腾讯CDC
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky
博客园 - 司徒正美
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
C
Check Point Blog
小众软件
小众软件
V
Visual Studio Blog
V
V2EX
F
Full Disclosure
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
罗磊的独立博客
人人都是产品经理
人人都是产品经理
量子位
Apple Machine Learning Research
Apple Machine Learning Research
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
博客园_首页
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Recorded Future
Recorded Future
G
Google Developers Blog
Vercel News
Vercel News
大猫的无限游戏
大猫的无限游戏
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
爱范儿
爱范儿
Jina AI
Jina AI

博客园 - dirgo

梅特勒托-托利多衡器串口连续输出数据格式的说明 utf-8编码详解 mybaits updateWrapper更新报错:无效的列类型: 1111 如何避免Mass Assignment漏洞? 关于vxe-table v4 导出大数据量excel浏览器卡死问题的解决 开源的Linux换源和安装docker脚本 wsl常用命令 使用网页静默打印 在Oracle中,授予用户角色和权限 Linux下查看当前哪些端口在监听状态,哪些端口在连接状态 mobaxterm常用配置 Windows下udp工具 Oracle表空间用户授权创建dblink等操作 用nmap扫描找出某个网段下空闲的ip脚本 Oracle 19c 常用运维 SQL Linux下设置CDB/PDB 环境的Oracle19c开机启动 Oracle是 CDB/PDB 环境下,让PDB在数据库启动后自动打开 怎样禁止dbeaver点击导航中数据库自动切换sql编辑器所属的数据库 Oracle 19c占内存高的解决方法 sudo -i -u zhangsan 与su - zhangsan区别,在现代 Linux 系统中,推荐使用 sudo 进行权限切换 Linux 的目录结构英文全称(及可能的命名背景)和更详细的说明 利用 Logback 的热加载特性,安全的迁移日志,改变日志保存路径 Linux中查询进程内存占用 iotDB调整内存占用及注意事项 Eclipse Milo 处理PLC"字(Word)"类型,最直接和正确的做法是使用其内置的 UShort 类型 centos7.9安装minio RELEASE.2025-04-22T22-12-26Z centos7.9编译安装nginx 1.28.1 linux(centos7.9)编译安装redis7.2.4 UFW 防火墙常用命令速查表
@RequestPart和@RequestParam有什么区别
dirgo · 2026-06-18 · via 博客园 - dirgo

@RequestParam@RequestPart 都用于接收请求参数,特别是在 multipart/form-data(表单提交/文件上传)场景下,它们经常可以互换使用。但它们在底层解析机制处理复杂对象的能力上有本质区别。
简单一句话总结:@RequestPart 更加强大,它能利用 HttpMessageConverter 自动将请求中的 JSON 或 XML 部分反序列化为 Java 对象,而 @RequestParam 只能拿到原始的字符串。
以下是核心区别:

1. 底层解析机制不同

  • @RequestParam:底层依赖 Servlet 的 request.getParameter() 方法。它把请求参数当成简单的字符串,然后通过 Spring 的 ConversionService 转换成 int、boolean 等基本类型。
  • @RequestPart:底层依赖 HttpMessageConverter(比如 Jackson)。它会去读取这个 "Part"(部分)的 Content-Type 头部信息,然后根据这个类型使用对应的转换器进行解析。

2. 处理复杂 JSON 对象的能力(最核心区别)

假设前端在 FormData 中不仅上传了文件,还把一段复杂的 JSON 字符串作为一部分传给了后端:
前端:

const formData = new FormData();
formData.append('file', fileObj);
// 将复杂对象转为 JSON Blob 传入 FormData (指定 Content-Type 为 json)
const userJson = { name: "张三", age: 20, roles: ["admin"] };
const userBlob = new Blob([JSON.stringify(userJson)], { type: 'application/json' });
formData.append('user', userBlob);
axios.post('/api/upload', formData);

后端区别:

  • 使用 @RequestParam(❌ 麻烦,拿到的是原始字符串)
@PostMapping("/upload")
public Result upload(@RequestParam("file") MultipartFile file, 
                     @RequestParam("user") String userStr) {
    // userStr 的值是 {"name":"张三","age":20,"roles":["admin"]}
    // 你需要自己引入 Jackson 手动反序列化:
    // ObjectMapper mapper = new ObjectMapper();
    // User user = mapper.readValue(userStr, User.class);
}
  • 使用 @RequestPart(✅ 完美,自动反序列化)
@PostMapping("/upload")
public Result upload(@RequestPart("file") MultipartFile file, 
                     @RequestPart("user") User user) {
    // Spring 发现 'user' 这个部分的 Content-Type 是 application/json
    // 自动调用 Jackson 将 JSON 转换成了 User 对象!
    System.out.println(user.getName()); // 张三
}

3. 接收普通表单字段时

如果前端只是传普通的扁平参数(formData.append('name', '张三')),两者没有区别,都能正常接收并绑定。

4. 文件上传 (MultipartFile) 时

对于纯粹的文件上传,两者都可以使用,功能上没有区别:

// 以下两种写法对于普通文件上传效果一样
public Result upload(@RequestParam("file") MultipartFile file)
public Result upload(@RequestPart("file") MultipartFile file)

不过从语义上来说,@RequestPart 更贴近 multipart/form-data 中 "Part"(部分)的概念,所以在较新的 Spring 版本中,处理文件和复杂混合数据时,官方更推荐使用 @RequestPart

总结对比表

对比维度 @RequestParam @RequestPart
设计初衷 简单的查询参数或表单字段 multipart 请求中的独立“部分”
底层机制 request.getParameter() HttpMessageConverter (如 Jackson)
接收复杂 JSON ❌ 只能拿到 String,需手动解析 ✅ 可直接映射为 Java 嵌套对象
接收普通字段 ✅ 支持 ✅ 支持
接收文件 ✅ 支持 ✅ 支持 (语义更标准)