zoukankan      html  css  js  c++  java
  • Xfire的aegis绑定方式配置小结

    最近正好在搞WEBSERVICE ,碰到了不少问题,幸好网络够强大,基本问题都能解决,先把些特性案例解决方案共享下

    首先说明,aegis为XFire默认的绑定方式,何时需要绑定?
    当使用JDK1.4时,或者对JDK1.5的范型和注释不是很熟悉的情况下,当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。

    首先说明,aegis为XFire默认的绑定方式,何时需要绑定?
    当使用JDK1.4时,或者对JDK1.5的范型和注释不是很熟悉的情况下,当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型)时,需要进行绑定,此时aegis的绑定为建立.aegis.xml的文件。

    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也可以对其正确映射。
    <?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的基本的学习的一个小结,所以没有太注重词语搭配,以看懂为主。。。有时间再来整理整理
  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/skrifer/p/1851291.html
Copyright © 2011-2022 走看看