浏览 16316 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-01
当使用JDK1.4时,或者对JDK1.5的范型和注释不是很熟悉的情况下,当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。 1.当封装的接口类中,某方法返回集合类型时,aegis的绑定方式: 例如,需要将以下接口封装 public interface UserInfo { public User findUserInfosByUserID(String userUniqueID); public String test(); public Collection findRoleInfosByUserID(String userUniqueID); } 观察此接口,受限我们看findRoleInfosByUserID方法,此方法传入String,返回类型为Collection,此时,我们即需要配置findRoleInfosByUserID方法。 配置步骤,在接口类的同一包下建立和接口名相同的aegis.xml文件,即UserInfo.aegis.xml文件。 UserInfo.aegis.xml <?xml version="1.0" encoding="UTF-8"?> <mappings> <mapping> <method name="findRoleInfosByUserID"> <return-type componentType="com.tongtech.bjvsp.sysmng.entity.Role" /> </method> </mapping> </mappings> 其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。 <return-type/>为配置返回类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,例如java.lang.String 此时,findRoleInfosByUserID方法配置完毕 PS,还拿此接口举例,如接口中,findRoleInfosByUserID接受的参数也为集合类型,那么需要在<method></method>之间再加入以下代码 <parameter index="0" componentType="java.lang.String"/> index="0"代表方法的参数的序号,0即第一个参数。 componentType代表集合参数内包含的类型,也可以为自定义对象,例如User 注意,如果findRoleInfosByUserID方法有两个参数,一个比如为String,一个为集合,那么只需要配置集合参数即可。 二。映射POJO 比如还是上面的UserInfo接口,第一个方法 public User findUserInfosByUserID(String userUniqueID); 此时,返回类型为User 如果User中仅为基本类型,例如String,int等基本类型,无需配置User 但如果User中还包含有其他类型,比如包含有Set,List,那么需要对其进行配置 比如User代码如下: public class User implements java.io.Serializable { // Fields private Integer userId; private String loginName; private String userPassword; private Integer SOrder; private String userCa; private String userName; private String userTel; private String userEmail; private String ZNote; private String userCode; private DicSystemAuth SDicSystemAuth; private Set SGroupUsers = new HashSet(0); private Set SUserDepts = new HashSet(0); } 此时User中还包含有SDicSystemAuth的对象,以及SUserDepts等Set集合 这种情况主要可能会出现在使用Hibernate,映射一对一,一对多表时 这里要特别注意 那么此时我们需要对User进行aegis绑定,控制POJO和XML的映射 配置方法: 在User对象所在包内建立User.aegis.xml 由于User中包含Set,那么只需要对集合做设置即可,DicSystemAuth下面单独讨论 我们可以分两次来配置,分别讲解 1, <?xml version="1.0" encoding="UTF-8"?> <mappings xmlns:my="http://my.bjvsp.tongtech.com"> <mapping name="my:User"> <property name="SGroupUsers" componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/> <property name="SUserDepts" componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/> </mapping> </mappings> 此时,配置文件中配置了两个Set集合,componentType明确定义了Set集合内包含的内容 此时,DicSystemAuth即便是自定义的对象类,由于不是集合,XFire也可以对其正确映射。 2 <?xml version="1.0" encoding="UTF-8"?> <mappings xmlns:my="http://my.bjvsp.tongtech.com"> <mapping name="my:User"> <property name="SGroupUsers" ignore="true"/> <property name="SUserDepts" ignore="true"/> <property name="SDicSystemAuth" ignore="true"/> </mapping> </mappings> 第二种方式,定义了三个字段,并使用了ignore属性,表示这三个属性不能被序列化。 那么,何时会遇到类似于User中Set集合,不被序列化呢? 当客户端访问本地代理时,如果User表内包含有其他表的关联时,如果基于hibernate的持久层,由于hibernate的惰性加载机制,加载User时仅会将User中的属性值加载而不会加载关联表中的值,比如set和SDicSystemAuth对象等,当客户端访问本地代理,序列化User对象时,如果没有设置关联字段是否序列化,那么它会将其全部序列化,但当序列化时,由于hibernate的惰性加载,此时Session已经关闭,那么在序列化关联字段的时候,就会出现session was close的异常。因此解决办法是在aegis绑定时制定关联字段的ignore属性设置为true。 还有一种解决办法,就是仍然按照第一种配置方式,明确指明关联的Set集合内的对象,但在执行序列化前,session关闭之前,提前将关联字段内的值初始化。 用Hibernate.initialize初始化 最后补充一小句 XFire对于自定义的对象可以聪明的找到,前提是它不包含集合 例如你的方法返回一个User对象 User中都是基本类型,或者User中包含有Dept对象的引用,都没有问题。 但如果你不希望加载user时序列化Dept出问题,就乖乖把dept初始化或将dept的ignore属性设置为true 本篇文章没什么头绪,想哪儿写哪儿,主要是对这段时间的xfire的基本的学习的一个小结,所以没有太注重词语搭配,以看懂为主。。。有时间再来整理整理 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-04
已经看懂,多谢分享,lz以后有这方面的经验还要共享呀~~~
|
|
返回顶楼 | |
发表时间:2007-08-17
已经成功运用到项目中了` 谢谢分享!!!
|
|
返回顶楼 | |
发表时间:2007-08-17
真是不错,多谢了,看了这篇文章,学习xfire又 能少走许多路了,多谢多谢
|
|
返回顶楼 | |