12

SpringBeanUtils.copyProperties()提供了在复制 bean 时忽略特定属性的选项:

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

Apache Commons BeanUtils 是否提供类似的功能?

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

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

我可以用 Spring 的 BeanUtils 实现同样的效果吗?

4

7 回答 7

6

如果您正在使用 ,则org.springframework.beans.BeanUtils可以使用该方法忽略特定属性copyProperties(Object source, Object target, String... ignoreProperties)。一个例子,

BeanUtils.copyProperties(sourceObj, targetObj, "aProperty", "another");
于 2016-05-23T22:49:04.440 回答
5

如果您想忽略null-value,您必须在复制属性之前使用以下代码行:

BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
于 2013-08-03T10:45:55.033 回答
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);
}
于 2019-08-28T07:38:13.613 回答
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 或类似方法将非空属性从一个对象复制到另一个对象

于 2021-09-27T14:27:54.963 回答
0

对于忽略空值:

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

对于忽略特定属性:

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

忽略属性的文档:Spring 4.1.0 docs

于 2021-07-08T18:37:14.923 回答
0

为了补充 Prajith 的答案,这是我选择源中存在空值的属性名称的一种方法。

出于某种原因,我觉得这更具可读性。您可以选择用 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]);
    }
于 2021-04-28T08:27:32.287 回答
-1

如果您想忽略特定属性,请执行以下操作(来自 BeanUtils API)

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

下面的示例:如果您想忽略名为“foo”的单个属性,只需添加为第三个参数

BeanUtils.copyProperties(src, target,"foo");

如果您想忽略一堆属性,请创建一个列表并将其作为第三个参数值发送

final List<String> exclusionsList = new ArrayList<>();
        exclusionsList.add("foo");
        exclusionsList.add("bar");
BeanUtils.copyProperties(src, target,exclusionsList);   
于 2019-12-04T22:27:03.467 回答