关于@RequestParam和@RequestBody的用法及说明

 更新时间:2026年03月16日 15:28:00   作者:灰阳阳  
本文主要介绍了Spring框架中参数绑定相关的三个注解:@RequestParam、@ModelAttribute和@RequestBody的使用场景和区别,通过比较它们的使用场景和注意事项,帮助读者快速理解并正确使用这些注解,避免在项目开发中出现常见问题

碎碎念

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

  • @Param
  • @RequestParam
  • @RequestBody

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

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

前言

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

  • @RequestParam
  • @RequestBody
  • @@ModelAttribute

一、@RequestParam

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

例如下面的请求:

GET /search?name=Tom&age=25

对应的Controller方法:

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

什么时候必须用@RequestParam?

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

@GetMapping("/search")
public String search(@RequestParam("user_name") String name) {
    return name;
}

参数非必传时(可选)必须明确标注

@GetMapping("/search")
public String search(@RequestParam(required = false) String name) {
    return name;
}

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

什么时候可以不用@RequestParam?

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

// URL: /search?name=Tom
@GetMapping("/search")
public String search(String name) {
    return name;
}

二、@ModelAttribute

作用

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

例如请求:

GET /user?name=Tom&age=20

对应的Controller方法:

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

User类定义:

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方法:

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

User类定义:

public class User {
    private String name;
    private Integer age;

    // getter和setter方法
}

什么时候必须用@RequestBody?

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

什么时候可以不用@RequestBody?

  • 当数据从URL参数(如GET请求)或表单数据中获取时,不需要也不能使用@RequestBody。
  • 对于表单提交,可以使用@ModelAttribute来代替:
@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

使用规范:

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

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

五、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何解决springboot启动的时候required a bean of type 'XXX' not be问题

    如何解决springboot启动的时候required a bean of ty

    Spring Boot启动失败,提示缺少`UserDao`类型的Bean,解决方案一:为`UserDao`接口添加`@Mapper`注解,重新启动;解决方案二:使用`@MapperScan`注解扫描Mapper接口所在的包
    2024-12-12
  • Java接入DeepSeek的保姆级教程(适合新手)

    Java接入DeepSeek的保姆级教程(适合新手)

    对于目前的DeepSeek大家应该都不是很陌生,目前也是最流行的一款AI软件了,所以为了让我们开发更全面,能够在自己的项目中融入AI那就会很全面了,所以这次的文章,将模拟一个基础案例,可以在这个基础案例迭代实现出你自己的AI,需要的朋友可以参考下
    2025-02-02
  • Spring配置文件的超详细图文介绍

    Spring配置文件的超详细图文介绍

    Spring配置文件是一个或多个标准的XML文档,下面这篇文章主要给大家介绍了关于Spring配置文件的超详细图文介绍,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • mybatis实现查询操作及获得添加的ID

    mybatis实现查询操作及获得添加的ID

    这篇文章主要介绍了mybatis实现查询操作及获得添加的ID,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • Java并发锁机制知识总结(最新整理)

    Java并发锁机制知识总结(最新整理)

    Java 的锁机制是并发编程的核心,用于解决多线程共享资源竞争问题,保证数据一致性和线程安全,这篇文章给大家介绍Java并发锁机制知识总结,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • springboot集成tkmapper及基本使用教程

    springboot集成tkmapper及基本使用教程

    tk.mybatis可以节省程序员的大部分时间,对于程序员来说关于一张表的操作无非就是增删改查,tk.mybatis提供了一些基本操作的SQL语句,比如说按表的主键查询、删除等基本操作,我们接下来就来介绍一些springboot集成tkmapper及基本使用
    2022-11-11
  • SpringBoot如何使用slf4j日志及其项目配置、MVC支持

    SpringBoot如何使用slf4j日志及其项目配置、MVC支持

    这篇文章主要介绍了SpringBoot如何使用slf4j日志及其项目配置、MVC支持,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 使用FeignClient调用POST表单Body内没有参数问题

    使用FeignClient调用POST表单Body内没有参数问题

    这篇文章主要介绍了使用FeignClient调用POST表单Body内没有参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 详解Kotlin:forEach也能break和continue

    详解Kotlin:forEach也能break和continue

    这篇文章主要介绍了详解Kotlin:forEach也能break和continue的相关资料,需要的朋友可以参考下
    2017-06-06
  • 解决SpringBoot中的Scheduled单线程执行问题

    解决SpringBoot中的Scheduled单线程执行问题

    在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败,这篇文章主要介绍了SpringBoot中的Scheduled单线程执行问题及解决方法,需要的朋友可以参考下
    2022-06-06

最新评论