什么?Lombok有坑?
事情是这样的,前段时间有个线上bug需要我去排查:
首先看了CAT的调用链,并没有发现什么问题,所有的服务都是正常处理结束。
于是我要了一个traceId,去排查日志,也是没有发现什么问题。
我拉下了生产版本的代码,走查了一下逻辑,并没有发现什么大问题,所以这注定是一个细节问题。
由于这是一个可以复现的问题,所以让测试大佬在测试环境模拟了下有问题的数据,于是我开始Debug了。
一行一行代码的看,一个一个变量的watch,最终发现了问题。
首先是同事新增了如下代码:
然后数据的OwnerId都是null:
紧接着执行了这个removeAll:
可是这为什么会出问题呢?
原来是list中的对象,是同事新加的,继承了原有的对象:
并且使用了Lombok的Data注解。这个注解会生成equals方法:
removeAll是调用的equals判断对象是否相同,equals方法重写后,导致只要这两个对象的ownerId都为空就会认为相同。
可以看到一个@Data注解相当于加了6个注解:
怎么解决这个问题呢?既然问题出在equals,那么有没有什么办法让子类生成的equals中也能包含基类的属性呢?
是有的:
1 |
加上这个注解就可以了。
可以看到@Data注解做的事情太多了,会发生你意想不到的情况,实际是不太推荐无脑使用的,建议还是自己组合需要的注解。