BeanUtils的copyProperties API用于忽略null和特定属性的复制。

15

Spring的BeanUtils.copyProperties()提供了忽略复制bean中特定属性的选项:

public static void copyProperties(Object source,
                 Object target,
                 String[] ignoreProperties) throws BeansException

Apache Commons BeanUtils提供了类似的功能吗?

在使用Spring的BeanUtils.copyProperties()时是否可以忽略空值?我在Commons BeanUtils中看到了这个功能:

Date defaultValue = null;
DateConverter converter = new DateConverter(defaultValue);
ConvertUtils.register(converter, Date.class);

我能用Spring的BeanUtils实现相同的功能吗?

6个回答

10

如果您使用的是org.springframework.beans.BeanUtils,则可以使用方法copyProperties(Object source, Object target, String... ignoreProperties)忽略特定属性。例如:

BeanUtils.copyProperties(sourceObj, targetObj, "aProperty", "another");

这与子属性不起作用,比如说我想忽略所有名称为“id”的属性。 - Yogesh Prajapati
问题不在于忽略子属性。如果没有关于忽略子属性的问题,那么请尝试创建一个新问题。 - Georgios Syngouroglou

5

如果你想忽略null值,在复制属性之前,你需要使用以下代码行:

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);

1
这段代码片段是做什么的? - kryger
看起来 ConverterUtils 不支持这种注册方法(至少在版本1.7.0中不支持)。 - HieuHT
1
不行...它不起作用,而且这个答案缺乏解释。 - Andrzej Polis
尝试过了,但是不起作用。第二个标志应该可以解决,但它并没有起作用。 - user3362334
方法 .register(false, false, 0) 不存在。 - Richard Hensman
请问您能否解释一下这段代码片段的作用? - rakesh

2

这是一个示例代码片段,我正在使用它来跳过空字段并将其复制到目标。您可以使用属性名称、值等添加特定属性的检查。我已经使用了org.springframework.beans.BeanUtils。

public static void copyNonNullProperties(Object src, Object target) {
    BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}

public static String[] getNullPropertyNames(Object source) {
    final BeanWrapper src = new BeanWrapperImpl(source);
    PropertyDescriptor[] pds = src.getPropertyDescriptors();

    Set<String> emptyNames = new HashSet<String>();
    for (PropertyDescriptor pd : pds) {
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null)
            emptyNames.add(pd.getName());
    }
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

0

我已经使用BeansUtils解决了这个问题,而且它也适用于嵌套类。

class NullAwareBeanUtilsBean extends BeanUtilsBean {
    
    
    @Override
    public void copyProperty(Object dest, String name, Object value)
            throws IllegalAccessException, InvocationTargetException {
        if (value == null)
            return;
        else if(value instanceof NonNullCopy) {
            Class<?> destClazz = value.getClass();
                Class<?> origClazz = dest.getClass();
                String className = destClazz.getSimpleName();
        
                for(Method m : origClazz.getDeclaredMethods()) {
                    if(m.getReturnType().equals(destClazz)) {
                        copyProperties(m.invoke(dest, Collections.EMPTY_LIST.toArray()),value);
                    }                       
                }
                return;
        }

        super.copyProperty(dest, name, value);
    }

       
}



我在这里发布的解决方案的完整说明: 使用BeanUtils或类似工具将非空属性从一个对象复制到另一个对象

0

补充Prajith的答案,这里是我从源代码中选择具有null值的属性名称的一种方法。

出于某种原因,我觉得这更易读。 您可以选择用try-catch包围或在方法级别添加throws。

public static void copyNonNullProperties(Object src, Object target) {
    BeanUtils.copyProperties(src, target, getNullPropertyNames(src));
}

public static String[] getNullPropertyNames(Object source) {
        List<String> nullValuePropertyNames = new ArrayList<>();
        for (Field f : source.getClass().getDeclaredFields()) {
            try {
                if (f.get(source) == null) {
                    nullValuePropertyNames.add(f.getName());
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return nullValuePropertyNames.toArray(new String[0]);
    }

-1
忽略空值:
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);

忽略特定属性:

public static void copyProperties(Object source,
                              Object target,
                              String... ignoreProperties)
                       throws BeansException

忽略属性的文档:Spring 4.1.0 文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接