就因为加了Lombok的@Accessors(chain = true),bean拷贝工具类不干活了
前言
这次新建了一个工程,因为 Lombok
用得很习惯,但以前的话,一般只用了@Data
,@AllArgsConstructor
,@EqualsAndHashCode
等常规注解;那这个Accessors(chain = true)
注解是干嘛的呢?
用了这个注解后,生成的set方法是这样的:
#加了Accessors(chain = true) public Devolution setCenterId(Long centerId) { this.centerId = centerId; return this; }
注意,正常情况下,方法应该是下面这样的:
#没加Accessors(chain = true) public void setCenterId(Long centerId) { this.centerId = centerId; }
为什么要用这个方法?主要是方便级联操作。基于这个考虑就加了。
加了后,出现了什么问题?
我们之前有个bean拷贝的工具类,用于在 po 和 vo 间拷贝属性。
import org.springframework.cglib.beans.BeanCopier; public static void copyProperties(Object source,Object target){ BeanCopier copier = getBeanCopier(source.getClass(), target.getClass()); copier.copy(source, target, null); }
结果,同事反映说,当target的类型,加了 Accessors(chain = true)
时, 这个工具类不能用了!
跟踪问题
我本来以为改改spring源码就可以了,结果发现org.springframework.cglib.beans.BeanCopier
源码打不开,换了个spring 4的版本,也不行。看到包里面,是待了cglib的,于是本地找了个cglib的包,发现是带source的,于是解压后导入工程,嗯,还不错,可以用!
工程代码在:
https://gitee.com/ckl111/cglib-lombok-test
我这里先说问题原因:
我找到了一个测试用例,大概如下:
public void testSimple() { BeanCopier copier = BeanCopier.create(MA.class, MA.class, false); MA bean1 =