✅ Lombok @Data 与 Jackson 字段反序列化规则不一致问题笔记
一、问题背景
在 SpringBoot 中使用 @RequestBody 接收 JSON 参数,DTO 字段明明有传,但字段值为 null。例如:
@Data
public class DriverUserRegisterDTO {
private String Password; // 首字母大写
}
@PostMapping("/test")
public R test(@RequestBody DriverUserRegisterDTO dto) {
System.out.println(dto.getPassword()); // 输出 null
}
二、问题原因
⚠️ 关键点:Jackson 在反序列化时是基于 JavaBean 规范 来推测 setter 方法的。
JavaBean 规范要求字段名首字母小写,否则推测方法名会出错。
💡 对比:
| 描述 | 内容 |
|---|---|
| DTO 字段名 | Password(首字母大写) |
| Lombok 生成方法 | getPassword() / setPassword(String)(符合字段名) |
| Jackson 推测方法 | setpassword(String)(首字母被强制小写) |
| 匹配结果 | ❌ 找不到,字段值为 null |
三、Jackson 是怎么推断的?
-
看到字段
Password(大写) -
将其首字母转为小写 → 变成
password -
然后拼成 setter 方法名:
setpassword()(注意:小写 p) -
最终找不到和
setPassword()匹配的方法,跳过赋值
四、解决方案
✅ 方案一:字段命名规范,首字母小写(推荐)
@Data
public class DriverUserRegisterDTO {
private String password;
}
这样生成的方法是 setPassword(),Jackson 能正确识别并赋值。
✅ 方案二:使用 @JsonProperty 显式映射字段名
@Data
public class DriverUserRegisterDTO {
@JsonProperty("Password")
private String Password;
}
此方式能让 Jackson 正确找到字段,但破坏规范,维护成本高,不推荐。
五、总结建议
| 建议项 | 内容 |
|---|---|
| 字段命名 | 始终使用驼峰命名、首字母小写(如:password) |
| 保持规范 | DTO、VO、PO 都遵循 JavaBean 标准 |
| 避免问题 | 不要随意首字母大写,Jackson/Lombok 默认行为不兼容 |
| 统一工具 | @Data + @RequestBody 搭配时需特别注意字段名规范 |

123

被折叠的 条评论
为什么被折叠?



