我正在使用以下代码行来调用以下网络服务:
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是空地图时,即[:]它可以正常工作。
我做错了什么?我如何格式化地图,或者我需要使用哪些其他对象才能使其正常工作?
答案 0 :(得分:1)
这已经快一年了......我希望你已经在其他地方找到了答案 只是为了记录我会添加我的想法
客户端应该生成一个名为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
}
答案 1 :(得分:0)
我们决定连接到使用REST而不是wsdl的另一个网关,因为我没有让它工作。我没有尝试过jpertinos解决方案,但它看起来很有希望。
但是,我正在关闭这张票。