通俗易懂搞懂@RequestParam 和 @RequestBody

碎碎念

作为一名学习spring框架的小白来说,项目实战无疑是学习成长速度最快的阶段之一。但这也不免会遇到很多折磨人的知识点让人防不胜防。比如参数绑定相关注解的使用:

  • @Param
  • @RequestParam
  • @RequestBody

用哪个?啥时候必须用?啥时候可以不用?把俺整的的一愣一愣的。

于是特意整理了这篇博客,目的是帮助大家快速理清这些注解的使用场景和区别,避开常见的坑点。


目录


前言

本博客将会详细讲解以下参数绑定相关注解的使用场景,说明它们之间的关系和区别,以及在项目开发中使用的规范:

  • @RequestParam
  • @RequestBody
  • @@ModelAttribute

一、@RequestParam

@RequestParam专门用于获取请求URL中的参数,也就是问号?后面的参数。(HTML的form表单也适用)

例如下面的请求:

复制代码
GET /search?name=Tom&age=25

对应的Controller方法:

java 复制代码
@GetMapping("/search")
public String search(@RequestParam String name, @RequestParam Integer age) {
    return "搜索名字:" + name + ",年龄:" + age;
}

什么时候必须用@RequestParam?

  • 当方法参数名和请求参数名不一致时必须用:

    java 复制代码
    @GetMapping("/search")
    public String search(@RequestParam("user_name") String name) {
        return name;
    }
  • 参数非必传时(可选)必须明确标注:

    java 复制代码
    @GetMapping("/search")
    public String search(@RequestParam(required = false) String name) {
        return name;
    }

RequestParam(required = false)的意思是如果前端没有传递参数name,不会直接报错,而是赋值null。

什么时候可以不用@RequestParam?

  • 当方法参数名和请求URL参数名完全一致并且参数是必传时,可以省略:

    java 复制代码
    // URL: /search?name=Tom
    @GetMapping("/search")
    public String search(String name) {
        return name;
    }

二、@ModelAttribute

作用

@ModelAttribute`注解专门用于将请求参数(URL参数 或表单数据)绑定到一个Java对象中,尤其适合表单提交的场景或有多个参数需要绑定的情况。

例如请求:

复制代码
GET /user?name=Tom&age=20

对应的Controller方法:

java 复制代码
@GetMapping("/user")
public String getUser(@ModelAttribute User user) {
    return "姓名:" + user.getName() + ",年龄:" + user.getAge();
}

User类定义:

java 复制代码
public class User {
    private String name;
    private Integer age;

    // getter和setter方法必须提供
}

使用@ModelAttribute时的注意点:

  • 对象的属性名称必须与请求中的参数名称保持一致,这样才能正确绑定。
  • 如果有多个参数,并且这些参数是Java对象的,那么推荐使用这个注解(前端发送请求非JSON等格式的情况下)

三、@RequestBody

@RequestBody用于接收HTTP请求体(Request Body)中的数据,常用于POST请求,通常是JSON格式的数据。

例如POST请求:

复制代码
POST /user
Content-Type: application/json

{
  "name": "Alice",
  "age": 30
}

对应的Controller方法:

java 复制代码
@PostMapping("/user")
public String createUser(@RequestBody User user) {
    return "用户姓名:" + user.getName() + ",年龄:" + user.getAge();
}

User类定义:

java 复制代码
public class User {
    private String name;
    private Integer age;

    // getter和setter方法
}

什么时候必须用@RequestBody?

  • 前端发送JSON数据或XML数据等格式到后端时必须用。
  • 当你需要整个请求体的数据绑定到一个Java对象时。

什么时候可以不用@RequestBody?

  • 当数据从URL参数(如GET请求)或表单数据中获取时,不需要也不能使用@RequestBody。
  • 对于表单提交,可以使用@ModelAttribute来代替:
java 复制代码
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {
    return user.getName();
}

四、表格整理

场景 传参方式 适用注解 是否必须
单个或少量简单参数(如 ?name=Tom) URL参数或表单提交 @RequestParam 推荐✅
多个参数形成对象(如 ?name=Tom&age=20) URL参数或表单提交 @ModelAttribute 推荐 ✅
JSON、XML数据 请求体(POST) @RequestBody 必须用 ✅

使用规范:

如果仍然觉得比较绕,最简单粗暴的方式就是全部都用上参数绑定。

因为不论参数是否一致,始终明确标注注解,可以提高代码可读性和可维护性。

相关推荐
Joy T5 小时前
Agent 确定性上下文设计:从 Prompt 参数注入到能力分层
java·开发语言·微服务·架构·prompt·agent context
m0_587383008 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·9 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
专注仿真9 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
Best-Wishes9 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
代码不停10 小时前
自动化测试(java)
java·开发语言·selenium·自动化
鬼手点金11 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
爱上网的小舟12 小时前
星际战士2启动错误怎么办?5种游戏报错解决方法
开发语言·php
paopaokaka_luck12 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
阿里嘎多学长12 小时前
2026-10-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管