免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2956 | 回复: 0
打印 上一主题 下一主题

Xfire的使用. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-21 15:54 |只看该作者 |倒序浏览

http://www.javaeye.com/topic/85622


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

  • public interface UserInfo {   
  •    
  •     public User findUserInfosByUserID(String userUniqueID);   
  •     public String test();   
  •     public Collection findRoleInfosByUserID(String userUniqueID);   
  •     }  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代码

  • xml version="1.0" encoding="UTF-8"?>   
  •    
  •         
  •         "findRoleInfosByUserID">   
  •             return-type   
  •                 componentType="com.tongtech.bjvsp.sysmng.entity.Role" />   
  •             
  •         
  •   xml version="1.0" encoding="UTF-8"?>
           
                   
                           
                   
           
    其中,method代表需要配置的方法名,由于XFire可以支持基本类型,针对集合类型时,需要配置,返回类型或参数类型为基本类型时不需要特殊配置。
    为配置返回类型,componentType属性代表返回的集合中所包含的类,此类可以是自定义的对象,也可以是基本类型,例如java.lang.String
    此时,findRoleInfosByUserID方法配置完毕
    PS,还拿此接口举例,如接口中,findRoleInfosByUserID接受的参数也为集合类型,那么需要在之间再加入以下代码
    Java代码

  • "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代码

  • 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);   
  • }  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代码

  • xml version="1.0" encoding="UTF-8"?>   
  • xmlns:my="http://my.bjvsp.tongtech.com">   
  • "my:User">   
  • "SGroupUsers" componentType="com.tongtech.bjvsp.sysmng.entity.GroupUser"/>   
  • "SUserDepts" componentType="com.tongtech.bjvsp.sysmng.entity.UserDept"/>   
  •    
  •   xml version="1.0" encoding="UTF-8"?>
    xmlns:my="http://my.bjvsp.tongtech.com">
    此时,配置文件中配置了两个Set集合,componentType明确定义了Set集合内包含的内容
    此时,DicSystemAuth即便是自定义的对象类,由于不是集合,XFire也可以对其正确映射。
    2
    Java代码

  • xml version="1.0" encoding="UTF-8"?>   
  • xmlns:my="http://my.bjvsp.tongtech.com">   
  • "my:User">   
  •    
  • "SGroupUsers" ignore="true"/>   
  • "SUserDepts" ignore="true"/>   
  • "SDicSystemAuth" ignore="true"/>   
  •    
  •   xml version="1.0" encoding="UTF-8"?>
    xmlns:my="http://my.bjvsp.tongtech.com">
    第二种方式,定义了三个字段,并使用了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的基本的学习的一个小结,所以没有太注重词语搭配,以看懂为主。。。有时间再来整理整理


    注意问题:
    当遇到需要映射POJO或配置WebService接口方法返回类型(如集合类型,自定义对象类型)时,需要进行绑定,此时aegis的绑定为建立 xxxx.aegis.xml的文件(xxxx为对应的实体名,如User.aegis.xml)。
    1 对于正常的String,int类型的数据,无需做特别说明就能映射。
    2 对于Collection类型,需要如下配置:(例如User对象里包含一个roleList属性)
            
       这是如果你的Role对象里都是基本数据类型,则可以不写Role.aegis.xml,但如果Role对象里也有其他类型的对象,则同样需  要配置Role.aegis.xml。
       当然如果你不想映射roleList,可以这么配置(所以无需映射的属性都可以这样配置):
            
    3 注意:对于一些非标准的写法需要做特殊处理。
        例如:在User实体类里有一个方法getOrg(),返回Department对象,但是User实体里面并没有org属性(正因为如此,我称之为非标准写法),这个时候,如果不特殊处理,此处会出现如下异常:
           java.lang.StackOverflowError
        at com.ctc.wstx.sw.BaseNsStreamWriter.closeStartElement(BaseNsStreamWriter.java:387)
        at com.ctc.wstx.sw.BaseNsStreamWriter.checkStartElement(BaseNsStreamWriter.java:436)
        at com.ctc.wstx.sw.SimpleNsStreamWriter.writeStartOrEmpty(SimpleNsStreamWriter.java:257)
        at com.ctc.wstx.sw.BaseNsStreamWriter.writeStartElement(BaseNsStreamWriter.java:318)
        at org.codehaus.xfire.aegis.stax.ElementWriter.writeStartElement(ElementWriter.java:116)
        at org.codehaus.xfire.aegis.stax.ElementWriter.(ElementWriter.java:61)
        at org.codehaus.xfire.aegis.stax.ElementWriter.getElementWriter(ElementWriter.java:161)
        at org.codehaus.xfire.aegis.type.basic.BeanType.getWriter(BeanType.java:421)
        at org.codehaus.xfire.aegis.type.basic.BeanType.writeObject(BeanType.java:386)
        ………………
       此时你无法跟踪。
       解决办法:在User实体里增加一个org属性,在User.aegis.xml里增加对org属性的配置就行了。

    http://www.cnblogs.com/yayagepei/articles/1160126.html



    客户端访问方法:


    package com.nstar.xfire.client;
    import java.util.List;
    import java.net.MalformedURLException;
    import java.util.ArrayList;
    import org.codehaus.xfire.*;
    import org.codehaus.xfire.client.XFireProxyFactory;
    import org.codehaus.xfire.service.Service;
    import org.codehaus.xfire.service.binding.ObjectServiceFactory;
    import com.nstar.xfire.IHelloWordService;
    import com.nstar.xfire.Student;
    public class HelloWorldClient {
    /**
      * @param args
      */
    public static void main(String[] args) {
      Service serviceModel = new ObjectServiceFactory().create(IHelloWordService.class);
      XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
      String url = "
    http://10.232.75.61:8090/Xfire/services/HelloWordService
    ";
      try {
       IHelloWordService service = (IHelloWordService) factory.create(serviceModel, url);
       List list = new ArrayList();
       List list1 = new ArrayList();
       list.add(new String("测试"));
       int age = service.getAge("边苏涛");
       String name = service.getName(1);
       Student s = service.getOneStudent(27);
       list1 = service.getStudent(list);
       System.out.println("边苏涛's age =="+age);
       System.out.println("学号为1的学生姓名 "+name);
       System.out.println("age == "+s.getAge()+" name == "+s.getName()+" list content "+s.getList().get(0).toString());
       System.out.println(list1.size());
       for(int i=0;i
    服务器端程序:

    文件:
    Xfire.rar
    大小:
    10KB
    下载:
    下载



    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/23783/showart_697461.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP