一、问题背景
在前后端联调接口时,开发者常遇到“前端传了参数,后端却收不到”的问题。某次开发中,前端通过POST
请求传递了一个JSON对象,后端使用@RequestBody
注解尝试接收参数,但断点调试时发现入参对象始终为null
或字段未被填充。经过排查,最终发现问题是由于入参接收类未添加Lombok的@Data
注解,导致Spring框架无法完成参数绑定。
二、问题复现与解决思路
1. 问题现象
-
前端代码(伪代码):
const data = { name: "John", age: 30, email: "john@example.com" }; axios.post("/api/user", JSON.stringify(data));
-
后端代码(Java):
@PostMapping("/api/user") public ResponseEntity<?> createUser(@RequestBody User user) { // user对象为null或字段未初始化 return ResponseEntity.ok(user); }
-
User类定义:
public class User { private String name; private int age; private String email; }
2. 问题定位
通过以下步骤逐步排查:
-
网络层验证:
- 使用Postman发送相同JSON数据,确认后端能正常接收。
- 排除跨域、HTTPS证书等问题。
-
日志分析:
- 启用Spring的HTTP消息转换日志(
logging.level.org.springframework.web=DEBUG
),发现框架提示:Could not instantiate argument [0] [type=User]
- 启用Spring的HTTP消息转换日志(
-
类结构检查:
User
类缺少setter
方法和默认构造函数,导致Spring无法实例化并注入字段值。
-
修复方案:
- 添加Lombok的
@Data
注解,自动生成getter
、setter
、toString
等方法。
- 添加Lombok的
三、核心知识点详解
1. @RequestBody
注解的工作原理
(1)功能定义
@RequestBody
是Spring MVC中的注解,用于将HTTP请求正文(Body)中的内容绑定到控制器方法的参数上。它支持JSON、XML等多种格式的数据转换。
(2)工作流程
-
请求解析:
- Spring通过
HandlerMapping
确定目标方法后,调用HandlerAdapter
进行参数解析。
- Spring通过
-
消息转换:
- 使用
HttpMessageConverter
将请求体中的原始数据(如JSON字符串)转换为目标对象。 - 默认使用的转换器为
Jackson2ObjectMapper
(基于Jackson库)。
- 使用
-
对象实例化:
- 框架通过反射创建目标类的实例(需存在无参构造函数)。
- 将JSON字段映射到对象的属性(需存在对应的
setter
方法或字段可见性允许直接赋值)。
(3)关键依赖条件
- 目标类必须提供无参构造函数(默认构造函数)。
- 目标类的字段必须有对应的**
setter
方法**或字段本身为public
。 - 字段名需与JSON键完全匹配(大小写敏感)。
(4)代码示例
@PostMapping("/a