BeanUtils.copyProperties(vo,po)的问题

我在用BeanUtils.copyProperties方法从PO向VO中复制数据时,如果数据库字段为空,则PO中的property为null,导致产生java.lang.reflect.InvocationTargetException异常,请问这个问题怎么解决?谢谢

要循环判断,beanutils是copy值,它的优点是不同类也可以copy

还要注意一点就是:如果你使用了hibernater3,好像这个东东就不起作用了,好像是cglib在作怪,具体是咋回来,还有待高手来解决了!!

根据属性拷贝,我以前好像碰到PO中的property为null,报错问题,后来就不让属性为空,例如List 就给它一个ArrayList实例,具体原因要研究这个类代码才能得知。

谢谢天龙工作室和beanq的关注,经过仔细的研究,原来的PO类中一个Date类型的属性为null时导致的异常,而其它基本数据类型的属性为null时则没有问题,
这样就好办多了,我的办法是让对应的数据库字段不能为空。

那么是不是所有的非基本类型的属性为null时,在BeanUtils.copyProperties都会出问题呢?

哈,不好意思,刚才突然发现原来是我写的VO类的问题,在我的VO类中有这样一段代码:
public void setBirthday(java.util.Date birthday) {
this.birthday = birthday;
this.birthdayTemp=birthday.toLocaleString();
}
忘了判断birthday为null的情况,现改为:
public void setBirthday(java.util.Date birthday) {
this.birthday = birthday;
if(birthday==null)
this.birthdayTemp="";
else
this.birthdayTemp=birthday.toLocaleString();
}
就没有异常了,并不是BeanUtils.copyProperties的问题,benq提到的List的情况我没试。

呵呵,beanutils的优点在于能给不同的两个成员变量相同的,但类名不同的两个类之间相互赋值,例如:


public class a{
private b b1;
int i;
}

public class d {
private c b1;
int i;
}

public class b {
int i;
}

public class c {
int i;
}

a a1 = new a();
d d1 = new d();
BeanUtils.compyProperties(a,d); // error ????这种情况就需要遍历 实现 ,具体做法自己写
至于空值不空值,它的实现方式,我觉得还是自己看下源代码!

BeanUtils在这方面并不出色,可以参看一下Dozer,现在我都用这个东东,它是基于BeanUtils,但在对象之间转换实在是太出色啦。 http://dozer.sourceforge.net/

Dozer 还是第一次见,请问linux_china,这个东西比BeanUtil好在哪里呢?

这两个开发包的目的部一样。
BeanUtils:Bean Introspection Utilities component,主要创建一下应用的工具类来处理Java reflection 和introspection。
Dozer就是在各个JavaBean之间来回拷贝数据。
当你的系统包含什么Form,BO,PO,VO,DTO,XXO等,你会发现同步这些数据的问题,Dozer就是解决这个问题。
BeanUtils.copyProperties的功能太简单,好多地方根本无法满足需求,有了Dozer就不一样啦。

最后想说一句,你的情况VO和PO同步信息,不要再用BeanUtils,它不适合做这件事情,如果在传到Struts的ActionForm,就更容易出问题,看看Dozer文档就一目了然。

我在看的BeanUtils源码的基础上和使用经验的结果上,整理了一遍《BeanUtils的copyProperties,populate实现方式分析以及容易引发的Bug 》http://hi.baidu.com/dearhwj/blog/item/7c1739193e05e772dab4bd0a.html