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 设置参数为可选。
相关推荐
居然是阿宋6 分钟前
C语言的中断 vs Java/Kotlin的异常:底层机制与高级抽象的对比
java·c语言·kotlin
ABdolphin15 分钟前
Spring-博客系统项目
数据库·sql·spring
sco528219 分钟前
SpringBoot 自动装配原理 & 自定义一个 starter
java·spring boot·后端
曼岛_27 分钟前
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
java·spring boot·http
_Itachi__37 分钟前
LeetCode 热题 100 543. 二叉树的直径
java·算法·leetcode
风吹落叶32571 小时前
线程的一些事(2)
java·java-ee
海风极客2 小时前
《Go小技巧&易错点100例》第三十三篇
开发语言·后端·golang
养军博客2 小时前
Spring boot 简单开发接口
java·spring boot·后端
喜欢便码2 小时前
xml与注解的区别
xml·java·开发语言
Android 小码峰啊2 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring