1. 程式人生 > >Xfire的aegis繫結方式配置小結

Xfire的aegis繫結方式配置小結

首先說明,aegis為XFire預設的繫結方式,何時需要繫結?
當使用JDK1.4時,或者對JDK1.5的範型和註釋不是很熟悉的情況下,當遇到需要對映POJO或配置WebService介面方法返回型別(如集合型別)時,需要進行繫結,此時aegis的繫結為建立.aegis.xml的檔案。

1.當封裝的介面類中,某方法返回集合型別時,aegis的繫結方式:
  例如,需要將以下介面封裝
Java程式碼 複製程式碼 收藏程式碼
  1. publicinterface UserInfo {   
  2. public User findUserInfosByUserID(String userUniqueID);   
  3. public String test();   
  4. public Collection findRoleInfosByUserID(String userUniqueID);   
  5.     }  
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
Java程式碼
複製程式碼
 收藏程式碼
  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>  
<?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>之間再加入以下程式碼
Java程式碼 複製程式碼 收藏程式碼
  1. <parameter index="0" componentType="java.lang.String"/>  
<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程式碼如下:
Java程式碼 複製程式碼 收藏程式碼
  1. publicclass User  implements java.io.Serializable {   
  2. // Fields    
  3. private Integer userId;   
  4. private String loginName;   
  5. private String userPassword;   
  6. private Integer SOrder;   
  7. private String userCa;   
  8. private String userName;   
  9. private String userTel;   
  10. private String userEmail;   
  11. private String ZNote;   
  12. private String userCode;   
  13. private DicSystemAuth SDicSystemAuth;   
  14. private Set SGroupUsers = new HashSet(0);   
  15. private Set SUserDepts = new HashSet(0);   
  16. }  
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,
Java程式碼 複製程式碼 收藏程式碼
  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>  
<?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
Java程式碼 複製程式碼 收藏程式碼
  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" ignore="true"/>   
  5. <property name="SUserDepts" ignore="true"/>   
  6. <property name="SDicSystemAuth" ignore="true"/>   
  7. </mapping>   
  8. </mappings>  
<?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的基本的學習的一個小結,所以沒有太注重詞語搭配,以看懂為主。。。有時間再來整理整理