我使用Apache Commons BeanUtils将一些属性从Source Bean复制到目标Bean。在这里,我不想在我的目标bean中设置来自源bean的空值。
例如:
Person sourcePerson = new Person();
sourcePerson.setHomePhone("123");
sourcePerson.setOfficePhone(null);
Person destPerson = new Person();
destPerson.setOfficePhone("456");
BeanUtils.copyProperties(destPerson, sourcePerson);
System.out.println(destPerson.getOffcePhone());
//这里destPerson officePhone设置为null
我该如何避免这种情况?我甚至尝试过以下声明:
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
似乎没有帮助。
我们可以在Apache Commons BeanUtils中排除空值吗?
答案 0 :(得分:1)
Apache Commons BeanUtils不支持这种情况。所以你应该自己做这件事:
public class BeanUtils {
public static void copyPropertiesIgnoreNull(Object source, Object dest) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
for(java.beans.PropertyDescriptor pd : pds) {
if(!src.isReadableProperty(pd.getName()) || pd.getWriteMethod() == null){
continue;
}
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) {
continue;
}
BeanUtils.copyProperties(dest, pd.getName(), srcValue);
}
}
}
答案 1 :(得分:1)
当嵌套属性时,BeanUtils不起作用,例如contact.businessName.firstname,其中firstName是字符串,其他是用户定义的类。
答案 2 :(得分:0)
扩展BeanUtilsBean
public class NullAwareBeanUtilsBean extends BeanUtilsBean{
@Override
public void copyProperty(Object dest, String name, Object value)
throws IllegalAccessException, InvocationTargetException {
if(value==null)return;
super.copyProperty(dest, name, value);
}
}
BeanUtilsBean notNull = new NullAwareBeanUtilsBean();
notNull.copyProperties(target, source);
应该这样做。