使用BeanCopier进行对象属性的复制,在对某一部分代码进行重构之后发现一部分POJO使用BeanCopier进行属性赋值失败。
进行资料查找,发现Cglib中通过Introspector获取BeanInfo,再获取对应的getter和setter方法,其中获取setter方法时,只会获取返回类型为void的setter方法
else if (argCount == 1) {
if (int.class.equals(argTypes[0]) && name.startsWith(GET_PREFIX)) {
pd = new IndexedPropertyDescriptor(this.beanClass, name.substring(3), null, null, method, null);
} else if (void.class.equals(resultType) && name.startsWith(SET_PREFIX)) {
// Simple setter
pd = new PropertyDescriptor(this.beanClass, name.substring(3), null, method);
if (throwsException(method, PropertyVetoException.class)) {
pd.setConstrained(true);
}
}
}
此时问题已定位,在重构时,将部分POJO上加上了Lombok的链式注解 @Accessor(chain = true),此注解会使setter方法返回this
故将该注解取消,问题解决。
EasyExcel中也是用了Cglib作为反射工具包,故也存在此问题。
使用Cglib进行属性复制时,默认不会进行类型的自动转换及基本类型和包装类型的自动拆箱装箱,需要使用自定义convert。