以前用WebWork的时候,因为选择了xml + xslt的方式,所以就要把object映射到xml。
最初想偷偷懒,不打算使用配置文件。于是就自己写了一个obj2xml,遇到了两个问题:
☆首先就是环的问题。
xml是树形结构,不允许出现环的。而对象关系中,很容易出现环。比如
Parent.getChildren();
Child.getParent(); 这样的代码。
我的解决方法是,在映射的时候,用hash map保存一个class到已知obj列表。不在已知列表里的,就先映射,然后加到已知obj列表里。在已知列表里的,就不再映射了。这样速度挺快,查找也方便。这个问题还算好解决。
☆接下来就是垃圾信息的屏蔽。
我是用get*来映射的(当然,集合类型会有特殊的处理)。
但是,get*方法中赫然有getClass存在!而Class类又有一堆get方法!这还算好办,直接屏蔽掉Class类型好了。
问题在于用户自己的一些无用信息。比如
DomainObject.getXXXService();
XXXServiceImpl.getYYYDAO();
YYYDAO.getZZZDAOSupport(); 还有就是多余的信息。比如我只想得到用户的基本信息,可是
class Person {
getName();
getAge();
getBirthday();
getEducationRecord();
}
class EducationRecord{
getMildSchool();
getUnivercity();
} 这样一来,本来不需要的教育的信息就会被映射到。由于Person对象可能会关联到很多对象,那样就会有很多无用的信息被包含进来。
对于这种情况,首先的想法就是LazyLoading。对于一般的使用,这是没有问题的。但是我的需求是要把XML发送到客户端。客户端会使用XML中的哪些数据,我的映射程序没有办法捕捉到。因此LazyLoading就毫无用武之地了。
没有办法,只能把责任推倒对被映射的object,让它注意不要包含无用的数据。可是这样一来,就要专门为映射准备一些bean,然后用BeanUtil给他们赋值,再传递给obj2xml。
最后实在没有办法,干脆彻底抛弃我的obj2xml,自己写了一个xmlResult,使用vm来生成xml。
虽然为需要写一些vm,但是比起专门准备一堆bean再用obj2xml映射,还是要简单直接一些。
可能这也是没有什么特别好用的obj/xml映射工具的原因吧!