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