论坛首页 Java企业应用论坛

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

浏览 10902 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-03-21  
SOA
我用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对象其实是被代理的, 现在我的问题应该怎么解决呢? 谢谢.
   发表时间: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>
0 请登录后投票
   发表时间:2007-03-21  
如果你用的是JDK5.0以上版本,建议用泛型来解决这个问题,如:
public void initPros(Map<String,PersonVO> webDataMap); 
0 请登录后投票
   发表时间:2007-03-21  
谢谢以上的回复, 现在我的问题的核心是, 为什么,我的这个webDataMap对象, 在传入PersistService的接口方法initPros(Map webDataMap)之前, 打印出来的hashCode为-1669610917, 但在接口方法中, webDataWeb的hashCode变为0了,证明在方法中的对象,都不是原先传入的那个,  这个PersistSerivce对象是用Xfire建立的的web service来的.
0 请登录后投票
   发表时间: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).
0 请登录后投票
   发表时间: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对象的内容.

0 请登录后投票
   发表时间:2007-03-25  
搞了三天,还没有解决。
0 请登录后投票
   发表时间:2007-03-25  
在只有做了一个最简化的工程,并打包上来,请大家帮我调试一下
  • XFireTest.rar (16.3 KB)
  • 描述: Eclipse工程文件
  • 下载次数: 111
0 请登录后投票
   发表时间:2007-03-25  
http://www.plastics-daily.com/lib.rar , 这是所需的jar包,解压后,加到WEB-INF/classes下面,并加入eclipse的build-path中就可以了。

0 请登录后投票
   发表时间:2007-03-25  
不会是你本地lazyload了,快照时已load,发送时未load吧?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics