BeanUtils.copyProperties(vo,po)的问题

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

1
天龙工作室
2005-07-04 17:39
要循环判断,beanutils是copy值,它的优点是不同类也可以copy

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

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

dyjun55
2005-07-05 09:55
谢谢天龙工作室和beanq的关注,经过仔细的研究,原来的PO类中一个Date类型的属性为null时导致的异常,而其它基本数据类型的属性为null时则没有问题,

这样就好办多了,我的办法是让对应的数据库字段不能为空。

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

dyjun55
2005-07-05 11:04
哈,不好意思,刚才突然发现原来是我写的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的情况我没试。

天龙工作室
2005-07-05 17:23
呵呵,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 ????这种情况就需要遍历 实现 ,具体做法自己写
  至于空值不空值,它的实现方式,我觉得还是自己看下源代码!
<p>

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

dyjun55
2005-07-06 20:48
Dozer 还是第一次见,请问linux_china,这个东西比BeanUtil好在哪里呢?

linux_china
2005-07-07 14:58
这两个开发包的目的部一样。

BeanUtils:Bean Introspection Utilities component,主要创建一下应用的工具类来处理Java reflection 和introspection。

Dozer就是在各个JavaBean之间来回拷贝数据。

当你的系统包含什么Form,BO,PO,VO,DTO,XXO等,你会发现同步这些数据的问题,Dozer就是解决这个问题。

BeanUtils.copyProperties的功能太简单,好多地方根本无法满足需求,有了Dozer就不一样啦。

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

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

猜你喜欢