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实现相同的目标吗?
答案 0 :(得分:7)
如果你想忽略null
- 值,你必须在复制属性之前使用以下代码行:
BeanUtilsBean.getInstance().getConvertUtils().register(false, false, 0);
答案 1 :(得分:5)
如果您使用org.springframework.beans.BeanUtils
,则可以使用方法copyProperties(Object source, Object target, String... ignoreProperties)
忽略特定属性。一个例子,
BeanUtils.copyProperties(sourceObj, targetObj, "aProperty", "another");
答案 2 :(得分:0)
这是一个示例代码片段,我用于在复制到目标时跳过空字段。您可以使用属性名称,值等添加对特定属性的检查。我使用了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);
}
答案 3 :(得分:0)
如果要忽略特定属性,请执行以下操作(从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);
答案 4 :(得分: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]);
}
答案 5 :(得分: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