1. @RequestBody 的作用
@RequestBody
注解用于将HTTP请求体中的JSON数据自动映射到Java对象。Spring Boot会自动处理这个转换过程。
2. 自动映射机制
Spring Boot使用Jackson库(默认的JSON处理器)来完成JSON到Java对象的转换:
- 序列化:Java对象 → JSON(响应时)
- 反序列化: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;
}