Spring中@RequestBody、@PathVariable、@RequestParam三个注解详解

目录

[1. @RequestBody](#1. @RequestBody)

用途:

常见场景:

示例代码:

注意事项:

[2. @PathVariable](#2. @PathVariable)

用途:

常见场景:

示例代码:

解释:

注意事项:

[3. @RequestParam](#3. @RequestParam)

用途:

常见场景:

示例代码:

解释:

注意事项:

[4. 总结与对比](#4. 总结与对比)

[5. 总结](#5. 总结)


在 Spring 中,@RequestBody@PathVariable@RequestParam 是常用的注解,用于处理请求中的不同类型的参数。每个注解都有其独特的用途和使用场景,下面将详细解释这三个注解,并给出示例及解释。


1. @RequestBody

用途:
  • @RequestBody 注解用于将请求的 请求体(Body) 中的数据绑定到方法参数。通常用于接收客户端发送的 JSON、XML 或其他类型的数据。
  • 主要用于 POST、PUT、PATCH 等 HTTP 方法,这些方法通常会有请求体。
常见场景:
  • 接收客户端发送的 JSON 格式数据并将其转换为 Java 对象。
  • 配合 @RestController 使用时,自动返回数据并将其转换为 JSON。
示例代码:
java 复制代码
@RestController
@RequestMapping("/api")
public class PersonController {

    // POST 请求,接收 JSON 格式的请求体
    @PostMapping("/person")
    public String createPerson(@RequestBody Person person) {
        // 输出请求体中的数据
        return "Person Created: " + person.getName() + ", Age: " + person.getAge();
    }
}
  • Person 类定义如下:
java 复制代码
public class Person {
    private String name;
    private int age;

    // Getter 和 Setter 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  • 客户端发送的 JSON 请求体如下:

    {
    "name": "John Doe",
    "age": 30
    }

Spring 会自动将请求体中的 JSON 转换为 Person 对象。

注意事项:
  • 需要在 Spring 配置中启用消息转换器(默认情况下 Spring Boot 会自动配置)。
  • 如果请求体的格式不正确(如格式不符合 JSON 格式),会抛出 HttpMessageNotReadableException 异常。

2. @PathVariable

用途:
  • @PathVariable 注解用于从 URL 的路径中提取参数。
  • 通常用于 RESTful API 中,当 URL 中包含动态变量时(如 /user/{id}),可以使用 @PathVariable 获取该动态变量的值。
常见场景:
  • 获取路径中的动态参数,例如获取用户 ID、文章 ID 等。
示例代码:
java 复制代码
@RestController
@RequestMapping("/api")
public class PersonController {

    // GET 请求,从路径中提取 personId
    @GetMapping("/person/{personId}")
    public String getPersonById(@PathVariable("personId") int personId) {
        // 根据 personId 获取数据
        return "Person with ID: " + personId;
    }
}
解释:
  • @GetMapping("/person/{personId}") 表示该请求处理的是 /person/{personId} 的 URL,其中 {personId} 是一个动态变量。
  • @PathVariable("personId") 用于从路径中获取 personId 的值。
  • 如果 URL 是 /person/123,则 personId 的值为 123
注意事项:
  • @PathVariable 注解中的参数名称必须与 URL 中的占位符名称一致(不区分大小写)。
  • 如果 URL 模式中有多个变量,可以通过多个 @PathVariable 来映射。

3. @RequestParam

用途:
  • @RequestParam 注解用于从请求的查询参数中提取数据,通常用于 GET 请求。
  • @RequestParam 可以获取 URL 中的查询参数,如 /api/person?id=1&name=John 中的 idname 参数。
常见场景:
  • 获取 URL 查询字符串中的参数,如从表单提交中获取参数,或者从 URL 中获取查询参数。
示例代码:
java 复制代码
@RestController
@RequestMapping("/api")
public class PersonController {

    // GET 请求,获取查询参数 id 和 name
    @GetMapping("/person")
    public String getPerson(@RequestParam("id") int id, @RequestParam("name") String name) {
        return "Person ID: " + id + ", Name: " + name;
    }
}
解释:
  • URL 示例:/api/person?id=1&name=John
  • @RequestParam("id") 获取 URL 中的查询参数 id@RequestParam("name") 获取查询参数 name
注意事项:
  • @RequestParam 默认是必需的,如果 URL 中没有对应的参数,会抛出 MissingServletRequestParameterException 异常。可以通过设置 required=false 来指定参数为可选:
javascript 复制代码
@GetMapping("/person")
public String getPerson(@RequestParam(name = "id", required = false, defaultValue = "0") int id) {
    return "Person ID: " + id;
}
  • @RequestParam 还支持获取参数的默认值(如上例中的 defaultValue 属性)。
  • 对于数组或 List 类型的参数,可以接收多个同名参数:
java 复制代码
@GetMapping("/person")
public String getPerson(@RequestParam List<String> names) {
    return "Names: " + names;
}

URL 示例:/api/person?names=John&names=Janenames 会接收到一个包含 "John""Jane" 的 List。


4. 总结与对比

注解 用途 适用场景 例子
@RequestBody 用于请求体,将请求数据转换为 Java 对象。 适用于 POST/PUT 请求,接受 JSON 或 XML 数据。 @RequestBody Person person
@PathVariable 用于从 URL 路径中提取变量。 适用于 RESTful 风格的 URL,获取路径中的动态数据。 @GetMapping("/person/{id}")
@RequestParam 用于从 URL 查询参数中获取数据。 适用于 GET 请求,获取 URL 查询参数。 @RequestParam("id") int id

5. 总结

  • @RequestBody 用于获取请求体的数据,通常与 POST、PUT 等方法一起使用,数据通常是 JSON 格式。
  • @PathVariable 用于从 URL 中获取动态路径参数,适用于 RESTful 风格的 API。
  • @RequestParam 用于从 URL 查询参数中获取数据,通常用于 GET 请求,可以通过 required=false 设置参数为可选。
相关推荐
码农研究僧7 分钟前
Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
java·spring boot·后端·事件发布与监听
NiNg_1_2349 分钟前
Spring Boot 实现文件上传和下载
java·spring boot·后端·文件上传
gentle_ice41 分钟前
leetcode——二叉树的中序遍历(java)
java·数据结构·算法·leetcode
苹果酱05671 小时前
mysql.sock.lock 导致mysql重启失败
java·spring boot·毕业设计·layui·课程设计
吃一口大米饭1 小时前
合并两个有序链表(leetcode刷题)
java·数据结构·算法·leetcode·链表
简 洁 冬冬1 小时前
Java中的Servlet
java·开发语言·servlet
fly spider2 小时前
多线程-线程池的使用
java·面试·线程池·多线程·juc
组合缺一2 小时前
Solon Cloud Gateway 开发:导引
java·gateway·reactor·solon·响应式
计算机-秋大田2 小时前
基于微信小程序的英语学习交流平台设计与实现(LW+源码+讲解)
spring boot·后端·学习·微信小程序·小程序
matlabgoodboy2 小时前
留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
开发语言·后端·ruby