java 日常开发踩坑之LomBok @Data映射为null
java 日常开发踩坑之LomBok
踩坑日记
常用java 开发的小伙伴们对于lombok再熟悉不过了,它的存在大大减少了我们开发者们自己去编写好多东西
Lombok 的作用:
- 通过使用
@Data
注解,Lombok 自动为类中的每个字段生成相应的 getter 和 setter 方法。- 同时,它还会生成
toString()
方法,以便于打印对象的详细信息。- 生成
equals()
和hashCode()
方法可以使对象能够正确地比较和用作集合中的键。
但是最近在使用的时候,出现了以下问题
问题复现
首先存在一个实体类 作为请求传入参数dto
/*** @version 1.0* @Author jerryLau* @Date 2024/10/2 10:45* @注释*/
@Data
public class UserDto {private String Name;private Integer Age;private String Address;private String Phone;
}
然后通过一个controller 进行将请求暴露出去
/*** @version 1.0* @Author jerryLau* @Date 2024/10/2 10:43* @注释*/
@RestController
@RequestMapping("/test")
public class TestController {@RequestMapping("/hello")public String hello(@RequestBody UserDto userDto) {System.out.println(userDto.toString());return "hello world";}
}
然后我们使用apipost 进行发送请求
那么小伙伴们猜一猜 这个控制台的实体打印是什么结果?
3、2、1我们公布答案
嘶 可能有的小伙伴们会有疑问?为什么在这个情况下 lombok 获取不到值呢?
我这个请求得到的实体类中,不可能时null啊?为什么会存在这种情况呢?
问题解析
我们再回到这个实体类上看 会发现这个实体类中好像与平常的不打一样?
可以看到各个变量中的首字母大写了
经过一系列的问题排查,果然 这个最终的问题是出现在实体类的这个变量名上:
Lombok 通常与 Java 的命名约定保持一致,通常情况下,字段(变量)应该以小写字母开头,而类名应该以大写字母开头。虽然技术上可以创建以大写字母开头的字段,Lombok 仍然建议遵循 Java 的命名约定。
如果您在字段名首字母大写的情况下使用 Lombok 的注解(如
@Data
),可能会导致 Lombok 生成的方法名称不符合预期,例如生成的 getter 和 setter 方法名可能会不符合 JavaBean 规范。例如,针对一个名为Name
的字段,Lombok 将生成getName()
方法,而不是在某些情况下可能产生混淆的getName()
。
那么我们将UserDto中的私有变量名进行修改
@Data
public class UserDto {private String name;private Integer age;private String address;private String phone;
}
再试着请求一次,发现打印出来的结果是正确的
另辟蹊径
比如说,我是个犟种,我的代码我做主,我就喜欢首字母大写的变量命名规范,我不改实体类UserDto的首字母,我就要大写。那么在这个情况下,还能不能通过Lombok实现呢?
那么 犟种的方法来了
可以在变量的上方添加@JsonProperty(“xxx”) 限定请求的字段名称来解决这一问题
我们修改UserDto实体类,添加字段注释
@Data
public class UserDto {@JsonProperty("Name")private String Name;@JsonProperty("Age")private Integer Age;@JsonProperty("Address")private String Address;@JsonProperty("Phone")private String Phone;
}
尝试发送请求,发现 你获得了一个犟种🤪🤪🤪🤪🤪
总结
哈哈哈哈哈 好了 关于lombok的字段映射不到的这个问题,已经解决,希望各位小伙伴们在平时的开发中遵循代码规范,开发不规范,调试两行泪!!!
当然 如果实在不规范 ,也可以通过犟种方法🤓🤓🤓
ok 我是 国庆还在公司加班的jerry ,就酱,拜了个拜