源本科技 | 码上会

@RequestBody

2026/03/30
23
0

引言

在 Spring Boot 开发 RESTful API 时,@RequestBody 是接收客户端请求体数据的核心注解,主要用于处理 POST/PUT/PATCH 等带请求体的 HTTP 请求。 它的核心能力是自动将 JSON/XML 格式的请求体数据反序列化为 Java 对象,底层依赖 Spring 默认集成的 Jackson 序列化框架,是前后端数据交互中最常用的注解之一。


@RequestBody

作用

HTTP 请求体(Request Body) 中的数据(JSON/XML)绑定到控制器方法的参数上,自动完成数据类型转换对象封装

底层原理

Spring Boot 内置 MappingJackson2HttpMessageConverter 消息转换器,自动完成: 前端 JSON 字符串后端 Java 对象(反序列化)

适用场景

  • 接收客户端提交的复杂对象数据(用户注册、订单创建、全量更新)

  • 处理 application/json 格式的请求(最常用)

  • 仅用于 POST/PUT/PATCH 请求(带请求体的请求)

核心属性

  • required:参数是否必填,默认 true(无请求体直接报错)

    @RequestBody(required = false) // 允许无请求体

完整示例

环境说明

  • Spring Boot Web 场景(自动集成 Jackson)

  • 请求格式:application/json

  • 响应格式:application/json

步骤1:创建实体类

必须提供 getter/setter 方法(Jackson 序列化 / 反序列化依赖),推荐使用 Lombok 简化代码:

import lombok.Data; // Lombok 注解,自动生成getter/setter/toString

/**
 * 用户实体类:对应前端传递的 JSON 数据结构
 */
@Data // 核心注解,省略手写get/set/toString
public class User {
    // 用户ID
    private Long id;
    // 用户名
    private String name;
    // 年龄
    private Integer age;
    // 邮箱
    private String email;
}

步骤2:创建控制器

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/users") // 统一接口前缀
public class UserController {

    /**
     * 1. 新增用户:接收 JSON 请求体
     * 请求方式:POST /api/users
     * 请求体:JSON 格式的 User 对象
     */
    @PostMapping
    public String createUser(@RequestBody User user) {
        // 直接使用封装好的 User 对象
        System.out.println("新增用户:" + user);
        return "用户创建成功:" + user.getName();
    }

    /**
     * 2. 全量更新用户:接收 JSON 请求体
     * 请求方式:PUT /api/users/1
     */
    @PutMapping("/{id}")
    public String updateUser(
            @PathVariable Long id,
            @RequestBody User user // 接收更新数据
    ) {
        user.setId(id);
        System.out.println("更新用户:" + user);
        return "用户更新成功";
    }

    /**
     * 3. 非必填请求体(required = false)
     */
    @PostMapping("/optional")
    public String optionalBody(@RequestBody(required = false) User user) {
        if (user == null) {
            return "未传递请求体";
        }
        return "接收数据:" + user;
    }
}

步骤3:启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootRequestBodyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootRequestBodyApplication.class, args);
    }
}

步骤4:测试请求

注:这里需要使用 ApiPost 或 cURL 工具进行测试

请求地址POST http://localhost:8080/api/users 请求头Content-Type: application/json 请求体

{
  "id": 1,
  "name": "卡提西亚",
  "age": 18,
  "email": "test@163.com"
}

控制台输出

新增用户:User(id=1, name=卡提西亚, age=18, email=test@163.com)

响应结果用户创建成功:卡提西亚


高级用法

接收集合/数组数据

适用于批量操作(批量新增、批量删除):

/**
 * 批量新增用户:接收 JSON 数组
 * 请求体:[{"name":"张三"},{"name":"李四"}]
 */
@PostMapping("/batch")
public String batchCreateUser(@RequestBody List<User> userList) {
    System.out.println("批量新增用户:" + userList);
    return "批量创建成功,共" + userList.size() + "人";
}

接收嵌套对象

支持复杂 JSON 结构:

// 嵌套实体类
@Data
public class Order {
    private Long orderId;
    private User user; // 嵌套User对象
}

// 控制器
@PostMapping("/orders")
public String createOrder(@RequestBody Order order) {
    return "订单创建成功:" + order.getUser().getName();
}

配合 @Valid 实现参数校验

对请求体数据做合法性校验(非空、长度、格式等):

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;

// 实体类添加校验注解
@Data
public class User {
    private Long id;
    @NotBlank(message = "用户名不能为空") // 非空校验
    private String name;
}

// 控制器开启校验
@PostMapping
public String createUser(@Valid @RequestBody User user) {
    return "用户创建成功";
}

与其他参数注解区别

注解

数据来源

数据格式

适用请求

核心用途

@RequestBody

请求体(Request Body)

JSON/XML

POST/PUT/PATCH

接收复杂对象

@RequestParam

URL 查询参数(?key=val)

简单键值对

GET/POST

接收筛选 / 分页参数

@PathVariable

URL 路径(/users/{id})

单个值

GET/DELETE

定位资源(ID)

@ModelAttribute

表单数据

表单键值对

POST 表单提交

传统表单数据接收


最佳实践

  1. 规范使用 新增用 @PostMapping + @RequestBody,更新用 @PutMapping + @RequestBody

  2. 参数校验 所有接口必须配合 @Valid 做参数校验,避免非法数据入库。

  3. 异常统一处理 全局捕获请求体解析异常、参数校验异常,返回标准化响应。

  4. 数据安全 敏感数据(密码、身份证)必须放在请求体中,禁止放在 URL 暴露。

  5. 编码规范 统一使用 application/json 格式,前后端字段名采用驼峰命名。


总结

  1. 核心功能@RequestBody 自动将 JSON 请求体转换为 Java 对象,是处理复杂提交数据的核心注解;

  2. 使用限制:仅用于 POST/PUT/PATCH 请求,禁止用于 GET

  3. 必备条件:实体类必须有 getter/setter,前端需指定 application/json 请求头;

  4. 扩展能力:支持集合、嵌套对象、参数校验,满足所有复杂数据交互场景。