XFire的aegis綁定

首先說明,aegis爲XFire默認的綁定方式,何時需要綁定?
當使用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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章