从一个对象图转换到另一个对象图。比如:
代码
- class Person{
- private String name;
- private Date birthdate;
-
- }
- class JobCategory{
- private String category;
-
- }
- class Adult extends Person {
- private Adult spouse;
- private Person[] kids
- private JobCategory jobCategory;
-
- }
- class PersonBean{
- private String name;
- private Date birthdate;
-
- }
-
- class JobCategoryBean{
- private String categoryName;
-
- }
- class AdultBean extends PersonBean {
- private String name;
- private Date birthdate;
- private JobCategoryBean jobCategory;
- private AdultBean spouse;
- private List kids;
-
- }
假设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的转换方法,于是转换仍然可以成功。 |