2025-11-14:@RequestBody注解的作用是什么?

阿里云教程2个月前发布
16 0 0

@RequestBody 是 Spring MVC(含 Spring Boot)核心注解之一,核心作用是 告知 Spring 框架:从 HTTP 请求体(Request Body)中读取数据,并自动反序列化为目标 Java 对象,专门用于接收前端传递的 JSON/XML 等格式的请求体数据。

一、核心功能拆解(通俗理解)

可以把 @RequestBody 理解为 “请求体数据的搬运工 + 格式转换器”,主要做两件事:

数据来源定位:明确告知 Spring,数据不在 URL 上(不是 @RequestParam 或 @PathVariable 对应的参数),而是在 HTTP 请求的「请求体(Body)」里;

自动反序列化:Spring 会根据请求头 Content-Type(如 application/json),调用对应的「消息转换器」(默认是 MappingJackson2HttpMessageConverter),将请求体中的文本数据(如 JSON 字符串)转换成你指定的 Java 对象(如 User、List 等),无需手动解析。

二、关键使用场景(必须用 @RequestBody 的情况)

当满足以下条件时,必须使用 @RequestBody:

前端传递的是 JSON/XML 格式数据(请求头 Content-Type: application/json 或 application/xml);

数据放在 请求体(Body) 中(前后端分离项目的主流传递方式);

后端需要接收 复杂对象(如嵌套对象、集合、数组等),而非简单的键值对。

典型示例(前后端分离主流场景)

前端(Axios 发 JSON 请求):

javascript

运行

axios.post(“/api/user/save”, {

  name: “张三”,

  age: 20,

  address: { province: “广东”, city: “深圳” } // 嵌套对象

}, {

  headers: { “Content-Type”: “application/json” } // 明确 JSON 格式

});

后端(@RequestBody 接收并自动转换):

java

运行

@RestController

public class UserController {

    // 用 @RequestBody 将 JSON 请求体转为 User 对象

    @PostMapping(“/api/user/save”)

    public String saveUser(@RequestBody User user) {

        System.out.println(user.getName()); // 直接获取转换后的属性:张三

        System.out.println(user.getAddress().getCity()); // 嵌套属性:深圳

        return “success”;

    }

    // 实体类(字段名与 JSON 键一致)

    static class User {

        private String name;

        private Integer age;

        private Address address; // 嵌套对象

        // getter + setter(必须有,Spring 反射赋值需要)

    }

    static class Address {

        private String province;

        private String city;

        // getter + setter

    }

}

三、核心特性(为什么必须用它?)

支持复杂数据结构:可直接接收 JSON 格式的嵌套对象、集合、数组(如 List<User>、User[]、Map<String, Object> 等),无需手动处理层级关系;

自动格式适配:

前端传 application/json(JSON 格式):依赖 jackson-databind 自动反序列化(Spring Boot 默认引入);

前端传 application/xml(XML 格式):引入 jackson-dataformat-xml 依赖后,可自动反序列化为 Java 对象;

字段映射灵活:支持用 @JsonProperty 处理 JSON 键与 Java 字段名不一致的情况(如 JSON 是 user_name,Java 是 userName):

java

运行

static class User {

    @JsonProperty(“user_name”) // JSON 键是 user_name,映射到 userName 字段

    private String userName;

    // getter + setter

}

四、与其他参数注解的区别(避坑关键)

许多人混淆 @RequestBody 与 @RequestParam/@ModelAttribute,核心区别在于 数据来源和解析方式,用表格清晰对比:

注解 数据来源 支持格式 适用场景

@RequestBody HTTP 请求体(Body) JSON/XML 等文本格式 复杂对象、嵌套结构、前后端分离 JSON 传输

@RequestParam URL 参数 / 表单参数 键值对(key=value) 简单参数(String、Integer 等)

@ModelAttribute URL 参数 / 表单参数 键值对(key=value) 简单 Java Bean(无嵌套的键值对)

关键避坑点:

若前端发 JSON 格式请求(Content-Type: application/json),后端用 @RequestParam 或 @ModelAttribute 接收,会直接失败(无法解析 JSON 格式);

若前端发表单格式请求(Content-Type: application/x-www-form-urlencoded),后端用 @RequestBody 接收,也会失败(请求体是 key=value 格式,不是 JSON/XML)。

五、常见使用注意事项

依赖必须存在:接收 JSON 时,需确保项目有 jackson-databind 依赖(Spring Boot 项目引入 spring-boot-starter-web 后默认包含),否则会报「无法解析请求体」异常;

请求头必须匹配:前端需设置 Content-Type: application/json(Axios 发对象时默认自动设置,若手动传字符串需显式指定);

Java Bean 必须有 getter/setter:Spring 通过反射赋值,无 getter/setter 会导致字段为 null;

可选性配置:若参数可空,可加 required = false(默认 required = true,请求体为空时会报错):

java

运行

// 允许请求体为空,user 可能为 null

public String saveUser(@RequestBody(required = false) User user) { … }

数组 / 集合接收:可直接接收 JSON 数组,无需额外包装:

java

运行

// 前端传 JSON 数组:[{“name”:”张三”},{“name”:”李四”}]

@PostMapping(“/api/user/batchSave”)

public String batchSave(@RequestBody List<User> userList) { … }

总结

@RequestBody 的核心作用是 “读取请求体数据 + 自动反序列化为 Java 对象”,是前后端分离项目中接收 JSON 格式复杂数据的 唯一标准方式。它解决了手动解析 JSON 字符串的繁琐工作,让数据绑定更高效、代码更简洁,是 Spring 生态中处理请求体数据的核心注解。

© 版权声明

相关文章

暂无评论

none
暂无评论...