问题现象:
今天在项目中使用到
BeanUtils.copyProperties(userInfo, bladeUserVo);
复制 userInfo对象 的所有属性值,到 bladeUserVo对象 的同名属性。但是失败了。
问题分析:
通过查看代码可知:
是因为原对象的实体类中使用了lombok插件的@Getter和@Setter注解。
而 BeanUtils.copyProperties(A, B); 是先找A对象中的getter和setter方法,再去找B对象中的getter和setter方法,通过属性名来匹配对应的方法,从而实现属性值复制,
然而在只用了 lombok插件 后,就会导致 A对象中的getter和setter方法处理逻辑发生了改变,与java原有逻辑不同:
lombok插件配置了@Accessors(chain = true)注解,该注解可以使被作用对象的setter方法返回值,从原本的 void 改为 属性的类型(如String,int,Integer等)。
解决方法:
1.不使用lombok插件:
其实lombok插件虽然使得代码看起来方便,但打包后反而更大了,因为getter/setter方法的逻辑没有太大改变,但却多了一个插件依赖包。
还不如自己手动定义getter/setter方法,也能避免一些方法的兼容问题(如 BeanUtils.copyProperties(A, B)),其实IDEA老司机都知道有快捷键 (Alt+Insert) 可以直接生成实体类的 getter/setter/toString/构造器等 方法,完全不会比lombok费时。
2.把A对象中需要用到的属性,调用它的getter方法,一个一个的用B对象对应的setter方法,赋值到B对象的同名属性上。
3.修改逻辑,具体操作原理和示例可以查看这位大佬的链接(转载):