2017-06-22 104 views
0

我已經獲得了用.NET編寫的SOAP Web服務的WSDL文件。我使用JAX-WS(JBoss自帶的實現)構建Java客戶端。JAX-WS SOAP請求與WSDL文件不匹配

我運行wsimport來生成類,並且我可以使用它們調用服務。問題在於JAX-WS似乎與.NET不同地解釋WSDL文件。

這是WSDL文件的摘錄。感興趣的元素都被命名minorgroups

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:complexType name="traffichistoryrequest"> 
     <xs:sequence> 
      <xs:element name="startmonth" type="xs:string" nillable="true"/> 
      <xs:element name="endmonth" type="xs:string" nillable="true" minOccurs="0"/> 
      <xs:element name="minorgroups" type="minorgrouplist" nillable="true" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="traffichistoryrequest" type="traffichistoryrequest" nillable="true"/> 
    <xs:complexType name="minorgrouplist"> 
     <xs:sequence> 
      <xs:element name="minorgroupcode" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="minorgrouplist" type="minorgrouplist" nillable="true"/> 

的JAX-WS生成的請求是這樣的。注意<minorgrouplist></minorgrouplist>

<ns2:request> 
    <startmonth>2017-01</startmonth> 
    <endmonth>2017-12</endmonth> 
    <minorgrouplist> 
     <minorgroupcode>group1</minorgroupcode> 
     <minorgroupcode>group2</minorgroupcode> 
    </minorgrouplist> 
</ns2:request> 

.NET服務期待<minorgroups></minorgroups>代替。如果我使用Visual Studio從此WSDL生成客戶端,那也是我所得到的。

我可以通過編輯WSDL片段的最後一行來修復JAX-WS客戶端請求,將該全局元素重命名爲minorgroups。但是不熟悉XML Schema,我不知道該全局元素的功能是什麼,更不用說JAX-WS是否正確使用它的名稱而不是traffichistoryrequest中的元素名稱。

那麼JAX-WS的行爲是否正確?

回答

0

有時候,沒有人回答你的問題本身就是一個暗示。 :-)

JAX-WS正在生成正確的類。我錯誤地構建了請求。

該模式列出了minorgrouplist類型的兩個不同元素。一個嵌套在traffichistoryrequest中,另一個是全局元素。

生成ObjectFactory類因此具有用於創建類型minorgrouplist的元件中的兩個類似的方法:

@XmlElementDecl(namespace = "", name = "minorgrouplist") 
public JAXBElement<Minorgrouplist> createMinorgrouplist(Minorgrouplist value) { 
    return new JAXBElement<Minorgrouplist>(_Minorgrouplist_QNAME, Minorgrouplist.class, null, value); 
} 

@XmlElementDecl(namespace = "", name = "minorgroups", scope = Traffichistoryrequest.class) 
public JAXBElement<Minorgrouplist> createTraffichistoryrequestMinorgroups(Minorgrouplist value) { 
    return new JAXBElement<Minorgrouplist>(_Minorgroups_QNAME, Minorgrouplist.class, Traffichistoryrequest.class, value); 
} 

注意不同的名字和範圍。

在構建請求時,我調用了錯誤的方法,使用正確的Java類型創建了一個對象,但是在錯誤的XML範圍內。這本身顯然不是一個錯誤,但是這個特定的模式也給了它們不同的名字。我有點驚訝JAX-WS沒有對元素範圍進行運行時的完整性檢查,而不是生成錯誤的請求,但也許這是有充分的理由的。)