JAX-WS hashmap和.NET字典的互操作性

时间:2014-03-28 20:05:32

标签: java .net web-services soap jax-ws

我在Wildfly 8.0上创建一个JAX-WS Web服务并在VS2013 C#项目中使用它,我无法弄清楚如何将HashMap映射到.net字典。

我的问题是,有没有办法创建一个与.net字典兼容的JAX-WS Web服务,并通过“添加服务引用”自动转换?

“添加服务参考”高级设置: enter image description here

测试网络服务:

@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>

1 个答案:

答案 0 :(得分:1)

我认为HashMap不具有互操作性;它也不是JAXB已知的Java xml类型(将SOAP XML转换为java实例的框架,这可能是它在WSDL中没有描述的原因。

您可以使用this post中的提示来提供适配器Java类,该类告诉JAXB运行时如何将HashMap转换为xml结构。

但是,我怀疑.Net客户端本身会将其作为Dictionary使用。您可以尝试从Java适配器生成this article中描述的xml结构,希望它将被解释为Dictionary。