2014-03-28 38 views
1

在Wildfly 8.0上創建JAX-WS webservice並在VS2013 C#項目上使用它,我無法弄清楚如何將HashMap映射到.net字典。JAX-WS hashmap和.NET dictionary的互操作性

我的問題是,有沒有辦法創建一個與.net字典兼容的JAX-WS webservice,並通過「Add service reference」自動轉換?

「添加服務引用」 高級設置: enter image description here

測試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> 

回答

1

我不認爲HashMap是可互操作;它也不是JAXB已知的Java xml類型(將SOAP XML轉換爲java實例的框架,這可能是爲什麼它不在WSDL中描述的原因)

您可以使用this post中的提示來提供適配器Java類它告訴JAXB運行時如何將HashMap轉換成XML結構。

不過,我懷疑這會通過.NET客戶端作爲Dictionary被本地消費。你可以嘗試以從您的Java在this article描述的XML結構適配器希望它可以解釋爲字典。