posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Xfire的aegis綁定方式配置小結(jié)

          Posted on 2008-03-03 11:23 semovy 閱讀(919) 評論(0)  編輯  收藏 所屬分類: WebService

          首先說明,aegis為XFire默認的綁定方式,何時需要綁定?

          當使用JDK1.4時,或者對JDK1.5的范型和注釋不是很熟悉的情況下,當遇到需要映射POJO或配置WebService接口方法返回類型(如集合類型)時,需要進行綁定,此時aegis的綁定為建立.aegis.xml的文件。

          1.當封裝的接口類中,某方法返回集合類型時,aegis的綁定方式:

          例如,需要將以下接口封裝

          代碼

          1. public interface UserInfo {   
          2.   
          3.     public User findUserInfosByUserID(String userUniqueID);   
          4.     public String test();   
          5.     public Collection findRoleInfosByUserID(String userUniqueID);   
          6.     }   
          7.   

           

          觀察此接口,受限我們看findRoleInfosByUserID方法,此方法傳入String,返回類型為Collection,此時,我們即需要配置findRoleInfosByUserID方法。

          配置步驟,在接口類的同一包下建立和接口名相同的aegis.xml文件,即UserInfo.aegis.xml文件。

          UserInfo.aegis.xml

          代碼

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <mappings>  
          3.     <mapping>  
          4.         <method name="findRoleInfosByUserID">  
          5.             <return-type  
          6.                 componentType="com.tongtech.bjvsp.sysmng.entity.Role" />  
          7.         </method>  
          8.     </mapping>  
          9. </mappings>  
          10.   

           

          其中,method代表需要配置的方法名,由于XFire可以支持基本類型,針對集合類型時,需要配置,返回類型或參數(shù)類型為基本類型時不需要特殊配置。

          <return-type/>為配置返回類型,componentType屬性代表返回的集合中所包含的類,此類可以是自定義的對象,也可以是基本類型,例如java.lang.String

          此時,findRoleInfosByUserID方法配置完畢

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

          代碼

          1. <parameter index="0" componentType="java.lang.String"/>   

           

          index="0"代表方法的參數(shù)的序號,0即第一個參數(shù)。

          componentType代表集合參數(shù)內(nèi)包含的類型,也可以為自定義對象,例如User

          注意,如果findRoleInfosByUserID方法有兩個參數(shù),一個比如為String,一個為集合,那么只需要配置集合參數(shù)即可。

          二。映射POJO

          比如還是上面的UserInfo接口,第一個方法

          public User findUserInfosByUserID(String userUniqueID);

          此時,返回類型為User

          如果User中僅為基本類型,例如String,int等基本類型,無需配置User

          但如果User中還包含有其他類型,比如包含有Set,List,那么需要對其進行配置

          比如User代碼如下:

          代碼

          1. public class User  implements java.io.Serializable {   
          2.   
          3.     // Fields       
          4.   
          5.      private Integer userId;   
          6.      private String loginName;   
          7.      private String userPassword;   
          8.      private Integer SOrder;   
          9.      private String userCa;   
          10.      private String userName;   
          11.      private String userTel;   
          12.      private String userEmail;   
          13.      private String ZNote;   
          14.      private String userCode;   
          15.      private DicSystemAuth SDicSystemAuth;   
          16.      private Set SGroupUsers = new HashSet(0);   
          17.      private Set SUserDepts = new HashSet(0);   
          18. }   

           

          此時User中還包含有SDicSystemAuth的對象,以及SUserDepts等Set集合

          這種情況主要可能會出現(xiàn)在使用Hibernate,映射一對一,一對多表時

          這里要特別注意

          那么此時我們需要對User進行aegis綁定,控制POJO和XML的映射

          配置方法:

          在User對象所在包內(nèi)建立User.aegis.xml

          由于User中包含Set,那么只需要對集合做設置即可,DicSystemAuth下面單獨討論

          我們可以分兩次來配置,分別講解

          1,

          代碼

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <mappings xmlns:my="http://my.bjvsp.tongtech.com">  
          3. <mapping name="my:User">  
          4. <property name="SGroupUsers" componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/>  
          5. <property name="SUserDepts" componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/>  
          6. </mapping>  
          7. </mappings>  

           

          此時,配置文件中配置了兩個Set集合,componentType明確定義了Set集合內(nèi)包含的內(nèi)容

          此時,DicSystemAuth即便是自定義的對象類,由于不是集合,XFire也可以對其正確映射。

          2

          代碼

          1. <?xml version="1.0" encoding="UTF-8"?>  
          2. <mappings xmlns:my="http://my.bjvsp.tongtech.com">  
          3. <mapping name="my:User">  
          4.   
          5. <property name="SGroupUsers" ignore="true"/>  
          6. <property name="SUserDepts" ignore="true"/>  
          7. <property name="SDicSystemAuth" ignore="true"/>  
          8. </mapping>  
          9. </mappings>  

           

          第二種方式,定義了三個字段,并使用了ignore屬性,表示這三個屬性不能被序列化。

          那么,何時會遇到類似于User中Set集合,不被序列化呢?

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

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

          用Hibernate.initialize初始化

          最后補充一小句

          XFire對于自定義的對象可以聰明的找到,前提是它不包含集合

          例如你的方法返回一個User對象

          User中都是基本類型,或者User中包含有Dept對象的引用,都沒有問題。

          但如果你不希望加載user時序列化Dept出問題,就乖乖把dept初始化或?qū)ept的ignore屬性設置為true

          主站蜘蛛池模板: 白沙| 中江县| 谢通门县| 民丰县| 贡觉县| 阿合奇县| 洪江市| 甘泉县| 黔西县| 杂多县| 江口县| 永城市| 余干县| 高青县| 黑山县| 安西县| 邹城市| 麻阳| 九龙坡区| 潢川县| 高雄市| 鹤山市| 磴口县| 萨迦县| 清徐县| 江永县| 毕节市| 兴和县| 金寨县| 景洪市| 育儿| 凤阳县| 太保市| 锡林郭勒盟| 神木县| 仁布县| 渝中区| 水富县| 亚东县| 临澧县| 绥化市|