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

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Vercel News
Vercel News
B
Blog
腾讯CDC
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
N
Netflix TechBlog - Medium
L
LangChain Blog
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
D
DataBreaches.Net
Stack Overflow Blog
Stack Overflow Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog

博客园 - dirgo

springboot里的application.yml文件的logging:下的配置 Flutter的SDK国内下载方法及AndroidStudio配置打包方法 minio数据迁移方法 [转]flutter入门 Elasticsearch介绍以及在spring项目里的使用方法 moxa NPort 5100 Linux real tty驱动安装 VirtualBox 的网络模式 Oracle关联表删除数据和更新数据 logback-spring.xml引入了base.xml日志文件默认生成在哪里? application.yml中Logback相关配置 org/springframework/boot/logging/logback/defaults.xml的内容和作用 logback-spring.xml 中<include resource="org/springframework/boot/logging/logback/base.xml"/>作用 Spring Boot 项目 Logback 日志框架配置文件logback-spring.xml详解 Oracle DataBaseLink 提示密码过期 梅特勒托-托利多衡器串口连续输出数据格式的说明 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开机启动
@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 嵌套对象
接收普通字段 ✅ 支持 ✅ 支持
接收文件 ✅ 支持 ✅ 支持 (语义更标准)