当前位置: 首页 > article >正文

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

目录

1. @RequestBody

用途:

常见场景:

示例代码:

注意事项:

2. @PathVariable

用途:

常见场景:

示例代码:

解释:

注意事项:

3. @RequestParam

用途:

常见场景:

示例代码:

解释:

注意事项:

4. 总结与对比

5. 总结


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


1. @RequestBody

用途:
  • @RequestBody 注解用于将请求的 请求体(Body) 中的数据绑定到方法参数。通常用于接收客户端发送的 JSON、XML 或其他类型的数据。
  • 主要用于 POST、PUT、PATCH 等 HTTP 方法,这些方法通常会有请求体。
常见场景:
  • 接收客户端发送的 JSON 格式数据并将其转换为 Java 对象。
  • 配合 @RestController 使用时,自动返回数据并将其转换为 JSON。
示例代码:
@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 类定义如下:
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 等。
示例代码:
@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 中获取查询参数。
示例代码:
@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 来指定参数为可选:
@GetMapping("/person")
public String getPerson(@RequestParam(name = "id", required = false, defaultValue = "0") int id) {
    return "Person ID: " + id;
}
  • @RequestParam 还支持获取参数的默认值(如上例中的 defaultValue 属性)。
  • 对于数组或 List 类型的参数,可以接收多个同名参数:
@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 设置参数为可选。


http://www.kler.cn/a/521970.html

相关文章:

  • 算法随笔_31:移动零
  • arkui-x 前端布局编码模板
  • Highcharts 柱形图:深入解析与最佳实践
  • Tailwind CSS 正式发布了 4.0 版本
  • c语言中mysql_query的概念和使用案例
  • AAAI2024论文合集解读|Multi-granularity Causal Structure Learning-water-merged
  • 如何用前端技术开发一个浪漫的生日祝福网站
  • 豆包MarsCode:前缀和计算问题
  • 【flutter版本升级】【Nativeshell适配】nativeshell需要做哪些更改
  • 《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
  • npm常见报错整理
  • .strip()用法
  • Nacos统一配置管理
  • read+write实现:链表放到文件+文件数据放到链表 的功能
  • 第1章 量子暗网中的血色黎明
  • 17【棋牌游戏到底有没有透视】
  • games101-(3/4)变换
  • 弹性分组环——RPR技术
  • python Fabric在自动化部署中的应用
  • 使用 Python 和 scikit-learn 实现 KNN 分类:以鸢尾花数据集为例
  • 【由浅入深认识Maven】第3部分 maven多模块管理
  • fastadmin中require-form.js的data-favisible控制显示隐藏
  • 基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现
  • S4 HANA定义税码(FTXP)
  • 【江苏省乡镇街道边界】面图层shp格式arcgis数据+乡镇名称和编码wgs84无偏移内容测评
  • 基于SpringBoot多数据源解决方案