忽略BeanUtils.copyProperties中的空值

时间:2017-05-05 08:08:41

标签: java spring mapping apache-commons-beanutils

我使用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中排除空值吗?

3 个答案:

答案 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);

应该这样做。