Java注解之@RequestBody

513 阅读2分钟
public Result save(@RequestBody Emp emp)  //是将Emp实体类提交到Request请求的方法体

在 Spring 框架中,@RequestBody 注解的作用是 将 HTTP 请求体中的数据绑定到方法参数(这里是 Emp 实体类) 。具体解释如下:

一、@RequestBody 的核心作用

1. 数据流向

客户端(JSON/XML数据) → HTTP请求体 → @RequestBodyJava对象(Emp
  • 客户端将数据以 JSON、XML 等格式放在 HTTP 请求体 中。
  • @RequestBody 注解会自动将请求体中的数据 反序列化为 Java 对象(借助 Jackson 等序列化工具)。

2. 典型应用场景

  • POST/PUT 请求:用于创建或更新资源(如新增员工、修改用户信息)。
  • 复杂对象传递:当参数是嵌套对象或数组时(如 Emp 包含多个属性)。

二、代码示例解析

1. Controller 方法

@PostMapping("/save")
public Result save(@RequestBody Emp emp) {
    // emp 对象已自动填充请求体中的数据
    empService.save(emp);  // 调用 Service 保存到数据库
    return Result.success();
}

2. 客户端请求示例(JSON 格式)

// HTTP POST 请求到 /save
// 请求头:Content-Type: application/json
{
    "id": 1,
    "name": "张三",
    "gender": 1,
    "salary": 8000.0,
    "hireDate": "2023-01-01"
}

3. Emp 实体类(简化)

@Data  // Lombok注解,自动生成getter/setter
public class Emp {
    private Integer id;
    private String name;
    private Integer gender;
    private Double salary;
    private LocalDate hireDate;
}

三、@RequestBody 的关键细节

1. 请求头要求

  • 必须指定 Content-Type

    • JSON:Content-Type: application/json
    • XML:Content-Type: application/xml

2. 数据格式与 Java 对象的映射

  • 字段名必须匹配:JSON 字段名与 Java 对象属性名需一致(忽略大小写)。

  • 复杂对象支持:支持嵌套结构,例如:

    {
        "id": 1,
        "department": {
            "deptId": 101,
            "deptName": "技术部"
        }
    }
    

    对应的 Java 类:

    @Data
    public class Emp {
        private Integer id;
        private Department department;  // 嵌套对象
    }
    
    @Data
    public class Department {
        private Integer deptId;
        private String deptName;
    }
    

3. 异常处理

  • 请求体为空:默认抛出 HttpMessageNotReadableException
  • 格式不匹配:如 JSON 字段类型与 Java 属性类型不一致,会抛出 HttpMessageConversionException

四、@RequestBody vs @RequestParam

@RequestBody@RequestParam
处理 HTTP 请求体中的数据处理 URL 参数(如 ?name=张三
适用于 POST/PUT 请求适用于 GET 请求或表单提交
适合复杂对象(如 JSON/XML)适合简单参数(如单个字符串、数字)
每个方法最多一个 @RequestBody 参数可多个 @RequestParam 参数