@RequestBody是Spring Boot中接收JSON请求体最直接的方式,核心在于自动反序列化,需满足三前提:HTTP方法含请求体(如POST/PUT)、Content-Type为application/json、请求体为合法JSON;后端实体类需字段名匹配(或用@JsonProperty)、含无参构造器和getter/setter、数值类型优先用包装类;Controller中一个方法仅可有一个@RequestBody参数,可与@PathVariable、@RequestParam共存,并支持@Valid校验。

@RequestBody 是 Spring Boot 中接收 JSON 请求体最直接的方式,核心在于“自动反序列化”——它不解析 URL 参数,也不读表单数据,只专注把请求体里的 JSON 字符串转成 Java 对象。
必须满足的三个前提
缺一不可,否则会报 400 或 415 错误:
- HTTP 方法得有请求体:只能用于 POST、PUT、PATCH 等,GET 请求本身没有请求体,用它必失败;
- 请求头必须带 Content-Type: application/json:Spring 靠这个头决定用 Jackson 转换器,漏了或写成 text/plain、application/x-www-form-urlencoded 都会走错流程;
- 请求体内容得是合法 JSON 字符串:比如 {"username":"李四","age":30},不能是单引号、尾逗号、未转义双引号等非法格式。
后端实体类怎么写才不踩坑
不是随便建个类就能接住,关键细节决定能不能赋值成功:
- 字段名默认严格匹配 JSON 的 key 名(大小写敏感),如 JSON 里是 "user_name",Java 字段就得叫 userName 或加 @JsonProperty("user_name");
- 必须有无参构造方法(Lombok 的 @Data 或 @NoArgsConstructor 可自动生成);
- 字段要有 getter/setter(@Data 也覆盖这点),private 字段没 setter,Jackson 就没法设值;
- 数值类型优先用包装类(Integer、Long),避免 JSON 缺失字段时因基本类型 int 默认为 0 导致业务误判。
Controller 层写法与常见组合
一个参数用 @RequestBody,其他参数可并存,但规则要清楚:
- 一个方法里最多只能有一个 @RequestBody 参数;
- 可以和 @PathVariable(取路径变量)、@RequestParam(取查询参数)同时用,比如:
@PutMapping("/users/{id}")
public Result update(@PathVariable Long id, @RequestParam String source, @RequestBody User user); - 加 @Valid 能触发校验(需字段上加 @NotBlank、@Email 等),校验失败自动返回 400 和错误详情,不用手动 if 判空。
出错了先查这四点
90% 的问题集中在这几个地方:
- 前端发的是 form-data 或 query 参数,却让后端用 @RequestBody 接——那是 @RequestParam 的活;
- 浏览器调试工具 Network 里点开请求,看 Payload 是否为空,Headers 里 Content-Type 是否正确;
- 后端日志有没有 Jackson 报错(如 Cannot construct instance、Missing type id),说明 JSON 结构和 Java 类不匹配;
- Maven 里确认 spring-boot-starter-web 已引入(它自带 Jackson),Spring Boot 2.3+ 若删过依赖,要补 jackson-databind。











