2017-06-20 69 views
1

我的wsdl規範包含導入的XSD模式。XPath評估空目標節點中的結果

WSDL文件看起來像下面

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" ....> 
<wsdl:types> 
<xsd:schema targetNamespace="http://tempuri.org/Imports"> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2" namespace="http://tempuri.org/"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svcc?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/System.Web.Services.Protocols"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd0" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd1" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.Services"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd5" namespace="http://schemas.datacontract.org/2004/07/System"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd7" namespace="http://schemas.datacontract.org/2004/07/System.Collections.Generic"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd8" namespace="http://schemas.datacontract.org/2004/07/ABC.Fs.UIEntities"/> 
<xsd:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd9"/> 
</xsd:schema> 
</wsdl:types> 
....... 
</wsdl:definitions> 

我JAXB綁定文件看起來象下面這樣:

<jaxws:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    wsdlLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?wsdl"> 
    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']"> 
    <jaxb:class name="NodeTypeString"/> 
    </jaxws:bindings>  
</jaxws:bindings> 

如果我不使用bindings.xml,我得到以下錯誤,同時通過生成Java類wsimport

[ERROR] Two declarations cause a collision in the ObjectFactory class. 
    line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3 

[ERROR] (Related to above error) This is the other declaration. 
    line 1 of https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd3 

模式它抱怨看起來像下面

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/ABCUser.Web.ServiceModels"> 
<xs:import schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd6" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/> 
....... 
<xs:complexType name="Node"> 
<xs:sequence> 
<xs:element minOccurs="0" name="Description" nillable="true" type="xs:string"/> 
<xs:element minOccurs="0" name="Name" nillable="true" type="xs:string"/> 
<xs:element minOccurs="0" name="Type" nillable="true" type="xs:string"/> 
<xs:element minOccurs="0" name="Users" nillable="true" type="tns:ArrayOfUser"/> 
</xs:sequence> 
</xs:complexType> 
<xs:element name="Node" nillable="true" type="tns:Node"/> 
...... 

但現在,當我使用bindings.xml,我收到以下錯誤

[ERROR] XPath evaluation of "wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']" results in an empty target node 
    line 8 of file:/E:/projects/codegeneration/bindings.xml 

我缺少什麼?我正在使用wsimport來生成類。

回答

0

我得到了兩個解決方案,我面對的這個問題。

  1. 我簡化了wsdl模式,方法是在其中添加導入的模式並刪除導入語句。
  2. 首先建立使用xjc進口模式

    xjc -episode myschema.episode myschema.xsd

    一個小插曲,然後使用這個情節作爲一個Java類綁定生成通過wsimport的

    wsimport mywsdl.wsdl -b myschema.episode

更多第二種解決方案here

1

<xsd:import>實際上並沒有改變WSDL文件的XML文檔樹。您的元素匹配wsdl:definitions/wsdl:types/xs:schema/xs:import,而不是wsdl:definitions/wsdl:types/xs:schema/xs:complexType/xs:sequence/xs:element

的JAX-WS規範的「自定義」一章說:

此外,jaxb:bindings可以將JAX-WS外部綁定文件中顯示爲jaxws:bindings元素,其node屬性指向內部的xs:schema元素的子一個WSDL文檔。處理模式時,結果務必如同jaxb:bindings元素在模式文檔中內聯,作爲模式組件上的註釋。

在處理嵌入式WSDL文檔內的模式文檔JAXB綁定聲明(即,jaxb:bindings元件),即在其內部出現所有XPath表達式必須被解釋爲,如果含有xs:schema元件是一個獨立的模式文檔的根。

所以,你的內心jaxws:bindings元素必須包含xs:schema元素的XPath,沒有任何後裔:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema"> 
    <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']"> 
     <jaxb:class name="NodeTypeString"/> 
    </jaxb:bindings> 
</jaxws:bindings>  

我不知道如果上述實際上與使用架構工作<xsd:import>。你可能不得不明確提到導入的模式:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema"> 
    <jaxb:bindings schemaLocation="https://abcserver.com/v2/two-way-ssl/MyService.svc?xsd=xsd2"> 
     <jaxb:bindings node="xs:complexType[@name='Node']/xs:sequence/xs:element[@name='Type']"> 
      <jaxb:class name="NodeTypeString"/> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxws:bindings>  
+0

我試過你的解決方案,但它給了我關於導致衝突的兩個聲明的原始錯誤。不知道這甚至是可能的。 – yogsma