加上@Accessors(chain = true)注解后CopyBean不生效问题分析

131 阅读1分钟

1、背景

某年某月的某一天,群中突然出现一条报障信息,说系统上某一个页面的筛选条件失效了。然后我们立马去查看相应的代码。

2、原因分析

最近我们组在做代码的改造优化,例如降低代码的圈复杂度,在改造的过程中,将原本通过一个一个set/get方法转化的实体类,优化成了链式调用的方式m.setA(xxx).setB(xxx).setC(xxx),因此加上了@Accessors(chain = true)注解。但是这一步是没有问题的。

通过排查发现,在这一步的前面,有使用到BeanTools.copyBean(XXX),在copyBean这一步,发现没有成功赋值,这是为什么?

里面有两个很细的点,一个是@Accessors(chain = true)注解 一个是CopyBean

2.1 @Accessors(chain = true)

加上@Accessor直接之后,之所以能够连续进行.set操作,是因为这个注解更改了属性字段set方法的返回值。原本set方法的返回值是void,加上@Accessor后,属性的set方法返回值变更为了对象本身。

2.2 CopyBean

分析CopyBean的原码,可以发现CopyBean在获取实体类的实例时,拿取的是返回类型为Void的字段的set方法,但是@Accessors已经将返回类型做了更改,因此CopyBean获取不到

3、解决方案

删除@Accessors(chain = true),将链式set更改成逐个set

4、思考

(1)对于有更改的功能,如果有测试资源,尽可能走测试,可以提前发现问题