@RequestBody 注解详解

1. @RequestBody 的作用

@RequestBody 注解用于将HTTP请求体中的JSON数据自动映射到Java对象。Spring Boot会自动处理这个转换过程。

2. 自动映射机制

Spring Boot使用Jackson库(默认的JSON处理器)来完成JSON到Java对象的转换:

  1. 序列化:Java对象 → JSON(响应时)
  2. 反序列化:JSON → Java对象(请求时,@RequestBody的作用)

3. 如何编写接收类(DTO/Entity)

基本要求:

  • 使用类(Class)
  • 提供无参构造函数
  • 提供getter/setter方法(或使用Lombok)
  • 字段名要与JSON中的key对应

示例代码:

// 方式1:传统写法
public class User {
    private String name;
    private Integer age;
    private String email;
    
    // 无参构造函数(必需)
    public User() {}
    
    // 有参构造函数(可选)
    public User(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
    
    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

// 方式2:使用Lombok(推荐)
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data  // 自动生成getter/setter/toString/equals/hashCode
@NoArgsConstructor  // 无参构造函数
@AllArgsConstructor // 全参构造函数
public class User {
    private String name;
    private Integer age;
    private String email;
}

tip:
如果想要使用Lombok,需要在pom.xml中写入依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

4. Controller中的使用

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // Spring自动将JSON转换为User对象
        System.out.println("接收到用户:" + user.getName());
        
        // 处理业务逻辑
        User savedUser = userService.save(user);
        
        return ResponseEntity.ok(savedUser);
    }
    
    @PutMapping("/{id}")
    public ResponseEntity<User> updateUser(
            @PathVariable Long id, 
            @RequestBody User user) {
        User updatedUser = userService.update(id, user);
        return ResponseEntity.ok(updatedUser);
    }
}

5. JSON映射示例

前端发送的JSON:

{
    "name": "张三",
    "age": 25,
    "email": "[email protected]"
}

自动映射到User对象:

User user = new User();
user.setName("张三");
user.setAge(25);
user.setEmail("[email protected]");

6. 高级特性

字段验证:

import javax.validation.constraints.*;

public class UserCreateDTO {
    @NotBlank(message = "姓名不能为空")
    @Size(min = 2, max = 50, message = "姓名长度必须在2-50之间")
    private String name;
    
    @NotNull(message = "年龄不能为空")
    @Min(value = 0, message = "年龄不能为负数")
    @Max(value = 150, message = "年龄不能超过150")
    private Integer age;
    
    @Email(message = "邮箱格式不正确")
    private String email;
}

// Controller中启用验证
@PostMapping
public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateDTO dto) {
    // 如果验证失败,Spring会自动返回400错误
    return ResponseEntity.ok(userService.create(dto));
}

JSON字段映射:

import com.fasterxml.jackson.annotation.JsonProperty;

public class UserDTO {
    @JsonProperty("user_name")  // JSON中的字段名
    private String name;        // Java中的字段名
    
    @JsonProperty("user_age")
    private Integer age;
}
添加新评论