【发布时间】:2014-06-23 16:43:59
【问题描述】:
有这个:
public class Parent {
private String name;
private int age;
private Date birthDate;
private Work work;
static class Work{
private int years;
private String employer;
}
// getters and setters
public static void main(String[] args) {
Parent c = new Parent;
c.setAge(55)
Work work=new Parent.Work();
work.setEmployer("Example");
c.setWork(work);
//save c in a DB...
}
}
我只想使用反射复制非空 属性。使用 beanUtils 的方法 described here 效果很好,但它复制了所有非空包装对象,而不仅仅是非空字段值:
//fetch c from the db...
Parent sameParent= new Parent;
sameParent.setWork(new Parent.Work());
//Directly from https://stackoverflow.com/questions/1301697/helper-in-order-to-copy-non-null-properties-from-object-to-another-java#answer-3521314
BeanUtilsBean notNull=new NullAwareBeanUtilsBean();
notNull.copyProperties(c, sameParent);
现在,Parent c 将拥有字段 age=55。 work.employer 字段将为空,因为对象 Work 已被覆盖。是否可以从 BeanUtilsBean 修改 @Override copyProperty 方法以递归地仅从包装对象中复制所需的(非空)属性?
要不然,你知道其他方法吗?
【问题讨论】:
-
我也需要做类似的事情,但是,我在这里有一个疑问,尽管我们单独复制了那些具有非空值的属性,但是默认值为空的 java 引用类型。所以复制的bean对于你的例子会有“name”和birthDate的空值吗?那么我们如何避免这种情况呢?我被困在这里了。
-
是的。在我的示例中,该字段的其余部分将具有空值。这是意料之中的,因为我没有在任何时候设置任何值。
标签: java apache-commons-beanutils