论坛首页 入门讨论版

bean transformation 框架

浏览 767 次
该帖已经被评为新手帖
作者 正文
最后更新时间:2006-10-21
一个遗留系统,包含大量的java bean的转换代码。

这种转换基本上都是名字对名字,比如:

person.setAge(personBean.getAge());
person.setName(personBean.getName());

这种东西简单,当然可以用BeanUtils搞定。

问题是不是所有情况都这么齐整。有那么20%的情况,或者名字不完全匹配,或者类型不匹配,需要custom的转换。

比如从业务bean转换成XmlBean的bean,往往就是这样:
Account acct = Account.Factory.newInstance();
Product[] products = new Product[...]
for(...){
  products[i] = convertProduct(mybean.getProducts()[i]);
}
acct.setProductArray(products);

也就是说,这种bean property的转换往往是以递归的方式从树的根部往下进行的。在进行的过程中虽然大部分的转换都是标准的,但是某些环节是不标准的。apache的beanutil的converter似乎只是针对叶子节点的。而我这里需要可以定制非叶子节点的转换,同时仍然能够递归处理下面的子节点。

在寻找一个库可以方便地做这种转换。不知道有没有?BeanUtils似乎不大行的。
   
最后更新时间:2006-10-18
www.opensymphony.com的oscore里面的beanutil比较强一些,不知道能不能满足你的要求。
   
0 请登录后投票
最后更新时间:2006-10-18
这个beanutil哪里强了?没找到什么apache不能做而它可以做的阿。还是我看得不仔细。robbin能不能提点一下?对了,说的是com.opensymphony.util.BeanUtils么?

(btw,BeanUtils似乎是j2ee专用的。需要依赖ServletRequest。
   
0 请登录后投票
最后更新时间:2006-10-18
Check out
com.opensymphony.xwork.util.OgnlUtil.copy
   
0 请登录后投票
最后更新时间:2006-10-18
ajoo 写道
这个beanutil哪里强了?没找到什么apache不能做而它可以做的阿。还是我看得不仔细。robbin能不能提点一下?对了,说的是com.opensymphony.util.BeanUtils么?

(btw,BeanUtils似乎是j2ee专用的。需要依赖ServletRequest。


用起来比较简单而已。
   
0 请登录后投票
最后更新时间:2006-10-21
连软件信息之窗的readonly都不能给出我想要的库,只好自己做了。

其实说起来,我要的功能并不复杂。BeanUtils只能处理String, int之类的转换,否则property的类型必须一致才行。

而我遇到的需求,是从一个对象图转换到另一个对象图。比如:
class Person{
  private String name;
  private Date birthdate;
   //getters and setters
}
class JobCategory{
  private String category;
  //getter and setter
}
class Adult extends Person {
  private Adult spouse;
  private Person[] kids
  private JobCategory jobCategory;
  //getters and setters
}
class PersonBean{
  private String name;
  private Date birthdate;
   //getters and setters
}

class JobCategoryBean{
  private String categoryName;
  //getter and setter
}
class AdultBean extends PersonBean {
  private String name;
  private Date birthdate;
  private JobCategoryBean jobCategory;
  private AdultBean spouse;
  private List kids;
  //getters and setters
}



假设AdultBean, PersonBean是从XMLBeans自动代码生成出来的,现在要把这些东西转换成Adult, Person, JobCategory这种对象树。

我理想的情况是,
AdultBean bean = ...;
Adult adult = new Adult();
BeanUtils.copy(adult, bean);

然后所有的name, birthdate, jobcategory, spouse, kids都自动转换好了。不能手工转换么?当然能,问题是,当我们每个bean class有二十多个property,有七八种这种bean class,有从axis到xmlbeans,从xmlbeans到业务bean,从甲层到乙层等等等等的转换任务时,这种转换就是一种对程序员的摧残了。

我还以为这个需求不是特别特殊,应该有人遇到过的呢。

当然,我上面举的例子因为JobCategory.name和JobCategoryBean.categoryName这两个property明子不匹配,更一般地说,不是每个property都是那么一对一的,很可能有其它的匹配的不那么整齐的情况发生。

对这种情况,我的解决方法是写一个conversion class:
class AdultConversion{
  public static void convert(JobCategory cat, JobCategoryBean bean){
    cat.setName(bean.getCategoryName());
  }
}

然后把这个conversion class传递给Beans这个facade:
AdultBean bean = ...;
Adult adult = new Adult();
Beans.copy(adult, bean, new AdultConversion());

Beans会分析AdultConversion的meta data,发现存在一个客户自定义的从JobCategoryBean到JobCategory的转换方法,于是转换仍然可以成功。

目前编码和测试基本完成,即将进入production乐。

居然没人遇到过这个问题,看来没有必要开源之了。
   
0 请登录后投票
论坛首页 入门讨论版

跳转论坛:
JavaEye推荐