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)对于有更改的功能,如果有测试资源,尽可能走测试,可以提前发现问题