什么?Lombok有坑?

事情是这样的,前段时间有个线上bug需要我去排查:
1

首先看了CAT的调用链,并没有发现什么问题,所有的服务都是正常处理结束。

于是我要了一个traceId,去排查日志,也是没有发现什么问题。

我拉下了生产版本的代码,走查了一下逻辑,并没有发现什么大问题,所以这注定是一个细节问题。

由于这是一个可以复现的问题,所以让测试大佬在测试环境模拟了下有问题的数据,于是我开始Debug了。

一行一行代码的看,一个一个变量的watch,最终发现了问题。

2

首先是同事新增了如下代码:

3

然后数据的OwnerId都是null:

4

紧接着执行了这个removeAll:

5

可是这为什么会出问题呢?

原来是list中的对象,是同事新加的,继承了原有的对象:

6

并且使用了Lombok的Data注解。这个注解会生成equals方法:

7

removeAll是调用的equals判断对象是否相同,equals方法重写后,导致只要这两个对象的ownerId都为空就会认为相同。

可以看到一个@Data注解相当于加了6个注解:

8

怎么解决这个问题呢?既然问题出在equals,那么有没有什么办法让子类生成的equals中也能包含基类的属性呢?

是有的:

1
@EqualsAndHashCode(callSuper = true)

加上这个注解就可以了。

可以看到@Data注解做的事情太多了,会发生你意想不到的情况,实际是不太推荐无脑使用的,建议还是自己组合需要的注解。

作者

太阳当空赵先生

发布于

2022-06-02

更新于

2022-06-02

许可协议

评论