Web services Groovy WsClient-映射类型未正确解析

Web services Groovy WsClient-映射类型未正确解析,web-services,groovy,Web Services,Groovy,我使用以下代码行调用下面的web服务: 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"

我使用以下代码行调用下面的web服务:

 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]  
用于web服务

  <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>  
但是,当additionalProperties是空映射时,即[:]它可以正常工作


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

这已经快一年了。。。我希望你已经在其他地方找到了答案。
为了记录在案,我会补充我的想法

客户端应该已经生成了一个名为
key
value
的属性类,只需使用普通的
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    
}

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


但是,我正在关闭此票证。

我们可以查看MsgService类的代码吗?至少是setAdditionalProperties()方法和AdditionalProperties内部类。我该怎么做?我可以使用msg.dump(),但这只能让我发送以下带有参数的MtServiceRequest:谢谢您的回答jpertino!可惜我一年前没拿到;-)。我们决定连接到另一个使用REST而不是wsdl的网关,因为我没有让它工作。但如果我要在grails中再次尝试wsdl,并且必须使用复杂的数据类型(如映射),我将尝试您的解决方案。
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    
}