关于XFire来做Web Service, 传入Service接口方法中的Collection类的值丢失的有关问题

关于XFire来做Web Service, 传入Service接口方法中的Collection类的值丢失的问题
我用XFire来建Web Serive, 能成功看到wsdl, 而且,能得到Web Service对象,

类型为PersistSerive, 实现 IPersistService接口, 其中有一个接口方法为:  public void initPros(Map webDataMap);

在与IPersistService同一个包下,定义了IPersistService.aegis.xml文件

<?xml version="1.0" encoding="UTF-8"?>   
<mappings>   
  <mapping >   
    
    <method name="initPros">
       <parameter index="1" componentType="java.util.Map"/>  
    </method>
    
  </mapping >    
</mappings>   



当我得到Service端的实现IPersistService接口的PersistService对象后, 就把一个client端的Map对象传入PersistService的initPros方法里面, 奇怪的是,这个Map各个key对应的对象,在传入
PersistService里面的initPros方法体后,就全为null了, 但根据打印出来的信息,这个Map在传入initPros之前, 是有值的.
我在debug模式下, 看到这个PersistService对象其实是被代理的, 现在我的问题应该怎么解决呢? 谢谢.
1 楼 dovecat 2007-03-21  
terry_yip 写道
我用XFire来建Web Serive, 能成功看到wsdl, 而且,能得到Web Service对象,

类型为PersistSerive, 实现 IPersistService接口, 其中有一个接口方法为:  public void initPros(Map webDataMap);

在与IPersistService同一个包下,定义了IPersistService.aegis.xml文件

<?xml version="1.0" encoding="UTF-8"?>   
<mappings>   
  <mapping >   
    
    <method name="initPros">
       <parameter index="1" componentType="java.util.Map"/>  
    </method>
    
  </mapping >    
</mappings>   



当我得到IPersistService的Service对象后, 就把一个Map对象传入initPros方法里面, 奇怪的是,这个Map各个key对应的对象,在传入
PersistService里面的initPros方法体后,就全为null了, 但根据打印出来的信息,这个Map在传入initPros之前, 是有值的.
我在debug模式下, 看到这个PersistService对象其实是被代理的, 现在我的问题应该怎么解决呢? 谢谢.
你可以看看xfire的demo例如在book的demo中必须将map中的key类型和
value类型也隐射出来:
<method name="getBooksMap">
    <parameter index="0" keyType="java.lang.String" componentType="org.codehaus.xfire.aegis.type.basic.SimpleBean"/>
    <return-type mappedName="BookMap" keyType="java.lang.String" 
                 componentType="org.codehaus.xfire.demo.Book" />
</method>
2 楼 ecsoftcn 2007-03-21  
如果你用的是JDK5.0以上版本,建议用泛型来解决这个问题,如:
public void initPros(Map<String,PersonVO> webDataMap); 
3 楼 terry_yip 2007-03-21  
谢谢以上的回复, 现在我的问题的核心是, 为什么,我的这个webDataMap对象, 在传入PersistService的接口方法initPros(Map webDataMap)之前, 打印出来的hashCode为-1669610917, 但在接口方法中, webDataWeb的hashCode变为0了,证明在方法中的对象,都不是原先传入的那个,  这个PersistSerivce对象是用Xfire建立的的web service来的.
4 楼 dovecat 2007-03-21  
terry_yip 写道
谢谢以上的回复, 现在我的问题的核心是, 为什么,我的这个webDataMap对象, 在传入PersistService的接口方法initPros(Map webDataMap)之前, 打印出来的hashCode为-1669610917, 但在接口方法中, webDataWeb的hashCode变为0了,证明在方法中的对象,都不是原先传入的那个,  这个PersistSerivce对象是用Xfire建立的的web service来的.
...aegis中Map在网络传输的过程中会被序列化为entry对象(在xml文件中),entry对象又包含key对象和value对象(都在xml文件中有定义).
你在客户端传输的map,到server端,会被反序列化为map(重新生成了),当然hashcode不一样(entry,key,value什么的也同样反序列最后组成Map).
5 楼 terry_yip 2007-03-21  
dovecat 写道
aegis中Map在网络传输的过程中会被序列化为entry对象(在xml文件中),entry对象又包含key对象和value对象(都在xml文件中有定义).
你在客户端传输的map,到server端,会被反序列化为map(重新生成了),当然hashcode不一样(entry,key,value什么的也同样反序列最后组成Map).


谢谢, 但我还是不明白, 为何Map对象从客户端传到server端后, 里面的value全为null, 用过xfire的朋友请帮忙一下, 或者提示一下能从什么地方跟踪entry对象的内容.

6 楼 terry_yip 2007-03-25  
搞了三天,还没有解决。
7 楼 terry_yip 2007-03-25  
在只有做了一个最简化的工程,并打包上来,请大家帮我调试一下
8 楼 terry_yip 2007-03-25  
http://www.plastics-daily.com/lib.rar , 这是所需的jar包,解压后,加到WEB-INF/classes下面,并加入eclipse的build-path中就可以了。

9 楼 jianfeng008cn 2007-03-25  
不会是你本地lazyload了,快照时已load,发送时未load吧?
10 楼 dovecat 2007-03-26  
...你是java ws call java ws还是java ws与.net交互啊?
11 楼 terry_yip 2007-03-26  
jianfeng008cn 写道
不会是你本地lazyload了,快照时已load,发送时未load吧?


我在上面的那个工程中,没有用到hibernate
12 楼 terry_yip 2007-03-26  
http://jira.codehaus.org/browse/XFIRE-161

据这个URL所述,有可能这是XFire的一个BUG.在上面只是写在XFire1.0中才有这个问题, 我用的是1.2.4版本

我刚才试过如果往一个List里面加入字符串,是能正确打印出来的,但Map就不行, 把Map对象加入List里面也不行.

或许也和JDK版本有关,我用的是JDK1.4, aegis文件定义的参数及返回类型, XFire应该是基于泛型来读取的.
13 楼 terry_yip 2007-03-26  
dovecat 写道
...你是java ws call java ws还是java ws与.net交互啊?


是java ws call java ws