posts - 0,  comments - 5,  trackbacks - 0
          Xfire的aegis綁定方式配置小結(jié)
          新一篇: XFire傳入傳出自定義類型和集合類型學(xué)習(xí)筆記

          首先說明,aegis為XFire默認(rèn)的綁定方式,何時(shí)需要綁定?
          當(dāng)使用JDK1.4時(shí),或者對(duì)JDK1.5的范型和注釋不是很熟悉的情況下,當(dāng)遇到需要映射POJO或配置WebService接口方法返回類型(如集合類型)時(shí),需要進(jìn)行綁定,此時(shí)aegis的綁定為建立.aegis.xml的文件。

          1.當(dāng)封裝的接口類中,某方法返回集合類型時(shí),aegis的綁定方式:
          例如,需要將以下接口封裝


          代碼
          public interface UserInfo {?
          ?
          ? ? public User findUserInfosByUserID(String userUniqueID);?
          ? ? public String test();?
          ? ? public Collection findRoleInfosByUserID(String userUniqueID);?
          ? ? }?
          ?


          觀察此接口,受限我們看findRoleInfosByUserID方法,此方法傳入String,返回類型為Collection,此時(shí),我們即需要配置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可以支持基本類型,針對(duì)集合類型時(shí),需要配置,返回類型或參數(shù)類型為基本類型時(shí)不需要特殊配置。
          <return-type/>為配置返回類型,componentType屬性代表返回的集合中所包含的類,此類可以是自定義的對(duì)象,也可以是基本類型,例如java.lang.String
          此時(shí),findRoleInfosByUserID方法配置完畢

          PS,還拿此接口舉例,如接口中,findRoleInfosByUserID接受的參數(shù)也為集合類型,那么需要在 <method> </method>之間再加入以下代碼


          代碼
          <parameter index="0" componentType="java.lang.String"/>?


          index="0"代表方法的參數(shù)的序號(hào),0即第一個(gè)參數(shù)。
          componentType代表集合參數(shù)內(nèi)包含的類型,也可以為自定義對(duì)象,例如User
          注意,如果findRoleInfosByUserID方法有兩個(gè)參數(shù),一個(gè)比如為String,一個(gè)為集合,那么只需要配置集合參數(shù)即可。

          二。映射POJO
          比如還是上面的UserInfo接口,第一個(gè)方法
          public User findUserInfosByUserID(String userUniqueID);
          此時(shí),返回類型為User
          如果User中僅為基本類型,例如String,int等基本類型,無需配置User

          但如果User中還包含有其他類型,比如包含有Set,List,那么需要對(duì)其進(jìn)行配置
          比如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);?
          }?


          此時(shí)User中還包含有SDicSystemAuth的對(duì)象,以及SUserDepts等Set集合
          這種情況主要可能會(huì)出現(xiàn)在使用Hibernate,映射一對(duì)一,一對(duì)多表時(shí)
          這里要特別注意
          那么此時(shí)我們需要對(duì)User進(jìn)行aegis綁定,控制POJO和XML的映射
          配置方法:
          在User對(duì)象所在包內(nèi)建立User.aegis.xml
          由于User中包含Set,那么只需要對(duì)集合做設(shè)置即可,DicSystemAuth下面單獨(dú)討論

          我們可以分兩次來配置,分別講解
          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>?


          此時(shí),配置文件中配置了兩個(gè)Set集合,componentType明確定義了Set集合內(nèi)包含的內(nèi)容
          此時(shí),DicSystemAuth即便是自定義的對(duì)象類,由于不是集合,XFire也可以對(duì)其正確映射。

          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>?


          第二種方式,定義了三個(gè)字段,并使用了ignore屬性,表示這三個(gè)屬性不能被序列化。
          那么,何時(shí)會(huì)遇到類似于User中Set集合,不被序列化呢?

          當(dāng)客戶端訪問本地代理時(shí),如果User表內(nèi)包含有其他表的關(guān)聯(lián)時(shí),如果基于hibernate的持久層,由于hibernate的惰性加載機(jī)制,加載User時(shí)僅會(huì)將User中的屬性值加載而不會(huì)加載關(guān)聯(lián)表中的值,比如set和SDicSystemAuth對(duì)象等,當(dāng)客戶端訪問本地代理,序列化User對(duì)象時(shí),如果沒有設(shè)置關(guān)聯(lián)字段是否序列化,那么它會(huì)將其全部序列化,但當(dāng)序列化時(shí),由于hibernate的惰性加載,此時(shí)Session已經(jīng)關(guān)閉,那么在序列化關(guān)聯(lián)字段的時(shí)候,就會(huì)出現(xiàn)session was close的異常。因此解決辦法是在aegis綁定時(shí)制定關(guān)聯(lián)字段的ignore屬性設(shè)置為true。

          還有一種解決辦法,就是仍然按照第一種配置方式,明確指明關(guān)聯(lián)的Set集合內(nèi)的對(duì)象,但在執(zhí)行序列化前,session關(guān)閉之前,提前將關(guān)聯(lián)字段內(nèi)的值初始化。
          用Hibernate.initialize初始化

          最后補(bǔ)充一小句
          XFire對(duì)于自定義的對(duì)象可以聰明的找到,前提是它不包含集合
          例如你的方法返回一個(gè)User對(duì)象
          User中都是基本類型,或者User中包含有Dept對(duì)象的引用,都沒有問題。
          但如果你不希望加載user時(shí)序列化Dept出問題,就乖乖把dept初始化或?qū)ept的ignore屬性設(shè)置為true
          posted on 2008-06-22 20:06 crazy 閱讀(881) 評(píng)論(2)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 华坪县| 婺源县| 洱源县| 长汀县| 汪清县| 青铜峡市| 玛曲县| 嵊州市| 武隆县| 松江区| 辽中县| 东丽区| 西和县| 习水县| 韶关市| 化州市| 东明县| 芜湖县| 城市| 榕江县| 吉安市| 通渭县| 来宾市| 盐边县| 永安市| 特克斯县| 株洲县| 佛教| 宁化县| 白银市| 霍州市| 保康县| 庆城县| 南投市| 文成县| 呼玛县| 沐川县| 合水县| 贺兰县| 和硕县| 灌云县|