Lombok @Data 与 Jackson 字段反序列化规则不一致


✅ 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 搭配时需特别注意字段名规范

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值