Groovy WsClient - 地图类型无法正确解析

时间:2010-02-10 21:02:29

标签: web-services groovy

我正在使用以下代码行来调用以下网络服务:

 def wsdl = 'http://somewhere.com/services/msgService?wsdl'  
 proxy = new WSClient(wsdl, this.class.classLoader)  
 proxy.initialize()  

 def msg = proxy.create("com.somwhere.test.api.MsgService")
 msg.applicationName = "APP1"  
 msg.clientId = 5  
 msg.additionalProperties = [test:3]  

用于网络服务

  <xs:schema targetNamespace="http://somewhere.com/test/api/MsgService" version="1.0" xmlns:tns="http://somewhere.com/test/api/MsgService" xmlns:xs="http://www.w3.org/2001/XMLSchema">  
 <xs:element name="sendMessage" type="tns:sendMessage"/>  
   <xs:complexType name="sendMessage">  
    <xs:sequence>  
     <xs:element minOccurs="0" name="mRequest" type="tns:mServiceRequest"/>  
    </xs:sequence>  
   </xs:complexType>  
   <xs:complexType name="mServiceRequest">  
    <xs:sequence>  
     <xs:element name="additionalProperties">  
      <xs:complexType>  
       <xs:sequence>  
        <xs:element maxOccurs="unbounded" minOccurs="0" name="entry">  
         <xs:complexType>  
          <xs:sequence>  
           <xs:element minOccurs="0" name="key" type="xs:string"/>  
           <xs:element minOccurs="0" name="value" type="xs:anyType"/>  
          </xs:sequence>  
         </xs:complexType>  
        </xs:element>  
       </xs:sequence>  
      </xs:complexType>  
     </xs:element>  
     <xs:element minOccurs="0" name="applicationName" type="xs:string"/>  
     <xs:element minOccurs="0" name="clientId" type="xs:long"/>  
     .......  
    </xs:sequence>  
   </xs:complexType>  
  </xs:schema>  

但是得到以下错误:

Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '{test=3}' with class 'java.util.LinkedHashMap' to class 'com.somwhere.test.api.MsgService$AdditionalProperties'

但是,当additionalProperties是空地图时,即[:]它可以正常工作。

我做错了什么?我如何格式化地图,或者我需要使用哪些其他对象才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

这已经快一年了......我希望你已经在其他地方找到了答案 只是为了记录我会添加我的想法

客户端应该生成一个名为keyvalue的属性的类,只需使用普通create()实例化它并设置所述属性。
字段additionalProperties可能是包含列表的所有“条目”或另一个类的简单列表,在这种情况下,您还必须创建()它。

最好的办法是在生成客户端时检查生成的类列表,创建每个类并转储它们以查看结构。
准备写这样的东西。

new groovyx.net.ws.WSClient(
    "http://localhost/service?wsdl",
    this.class.classLoader).with {
  initialize()

  def wrapper = create('defaultnamespace.MapWrapper')
  wrapper.map = create('defaultnamespace.ArrayOfMapWrapperEntry')
  wrapper.map.mapWrapperEntry = [key1:'value1',key2:'value2'].collect{k,v->
    def entry = create('defaultnamespace.MapWrapperEntry')
    entry.key = k
    entry.value = v
    entry
  }

  send wrapper    
}

答案 1 :(得分:0)

我们决定连接到使用REST而不是wsdl的另一个网关,因为我没有让它工作。我没有尝试过jpertinos解决方案,但它看起来很有希望。

但是,我正在关闭这张票。