BeanUtils.copyProperties避坑
先说一下我遇到的问题吧,我用了org.springframework.beans;下的BeanUtils.copyProperties(ModelA,ModelB),应该是将A复制到B,可是在复制完后续处理数据的过程中,处理代码没问题,可是一直报错,之后才发现原来是这样的,举个栗子
ModelA中有个集合是这样的
private List<Class1> classList;
ModelB中有个集合是这样的
private List<Class2> classList;
因为情景需要,Class1和Class2有个别变量是不一样的
因为名字一样都是classList,复制过程中ModelB中的classList就被Model A的classList完全覆盖了,导致集合类型也变了,可是通过ModelB的get和set方法得到的集合类型依旧是List< Class2>,就导致了之后处理的冲突
发现这个问题之后,我是这样处理的
//集合复制
public static <E, T> List<T> convertList(List<E> input, Class<T> clzz) {
List<T> output = Lists.newArrayList();
if (!CollectionUtils.isEmpty(input)) {
for (E source : input) {
T target = BeanUtils.instantiateClass(clzz);
BeanUtils.copyProperties(source, target);
output.add(target);
}
}
return output;
}
//复制
private School2 copy(School1 school1, School2 school2) {
if(school1 != null) {
BeanUtils.copyProperties(school1, school2);
List<Class2> list = convertList(school1.getClassList(), Class2.class);
school2.setClassList(list);
}
return school2;
}
这样就保证了复制结果中List集合的类型也是正确的
使用过程中还需注意一点
两种框架下的BeanUtils.copyProperties用法不一样
package org.springframework.beans中BeanUtils.copyProperties(A,B)
是A中的值付给B
package org.apache.commons.beanutils中BeanUtils.copyProperties(A,B)
是B中的值付给A