我在Wildfly 8.0上创建一个JAX-WS Web服务并在VS2013 C#项目中使用它,我无法弄清楚如何将HashMap映射到.net字典。
我的问题是,有没有办法创建一个与.net字典兼容的JAX-WS Web服务,并通过“添加服务引用”自动转换?
“添加服务参考”高级设置:
测试网络服务:
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class Test
{
@WebMethod
public HashMap<String, Pojo> echoMap(String input)
{
return new HashMap<String, Pojo>();
}
}
生成的WSDL:
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.aiko.com/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="TestService" targetNamespace="http://ws.aiko.com/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.aiko.com/" targetNamespace="http://ws.aiko.com/" version="1.0">
<xs:element name="facility" type="tns:pojo"/>
<xs:complexType name="pojo">
<xs:sequence>
<xs:element minOccurs="0" name="Name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="echoMapResponse">
<wsdl:part name="return">
</wsdl:part>
</wsdl:message>
<wsdl:message name="echoMap">
<wsdl:part name="arg0" type="xsd:string">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="Test">
<wsdl:operation name="echoMap">
<wsdl:input message="tns:echoMap" name="echoMap">
</wsdl:input>
<wsdl:output message="tns:echoMapResponse" name="echoMapResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestServiceSoapBinding" type="tns:Test">
<soap12:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="echoMap">
<soap12:operation soapAction="" style="rpc"/>
<wsdl:input name="echoMap">
<soap12:body namespace="http://ws.aiko.com/" use="literal"/>
</wsdl:input>
<wsdl:output name="echoMapResponse">
<soap12:body namespace="http://ws.aiko.com/" use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestService">
<wsdl:port binding="tns:TestServiceSoapBinding" name="TestPort">
<soap12:address location="http://localhost:8080/app/Test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
答案 0 :(得分:1)
我认为HashMap
不具有互操作性;它也不是JAXB已知的Java xml类型(将SOAP XML转换为java实例的框架,这可能是它在WSDL中没有描述的原因。
您可以使用this post中的提示来提供适配器Java类,该类告诉JAXB运行时如何将HashMap
转换为xml结构。
但是,我怀疑.Net客户端本身会将其作为Dictionary
使用。您可以尝试从Java适配器生成this article中描述的xml结构,希望它将被解释为Dictionary。