浏览 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似乎不大行的。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-10-18
www.opensymphony.com的oscore里面的beanutil比较强一些,不知道能不能满足你的要求。
|
|
| 返回顶楼 | |
|
最后更新时间:2006-10-18
这个beanutil哪里强了?没找到什么apache不能做而它可以做的阿。还是我看得不仔细。robbin能不能提点一下?对了,说的是com.opensymphony.util.BeanUtils么?
(btw,BeanUtils似乎是j2ee专用的。需要依赖ServletRequest。 |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-18
Check out
com.opensymphony.xwork.util.OgnlUtil.copy |
|
| 返回顶楼 | |
|
最后更新时间:2006-10-18
ajoo 写道 这个beanutil哪里强了?没找到什么apache不能做而它可以做的阿。还是我看得不仔细。robbin能不能提点一下?对了,说的是com.opensymphony.util.BeanUtils么?
(btw,BeanUtils似乎是j2ee专用的。需要依赖ServletRequest。 用起来比较简单而已。 |
|
| 返回顶楼 | |
|
最后更新时间: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乐。 居然没人遇到过这个问题,看来没有必要开源之了。 |
|
| 返回顶楼 | |







