2017-06-20 11 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

私は、私が直面していたこの問題には2つのソリューションを得ました。

  1. 私はインポートされたスキーマを追加してインポートステートメントを削除することで、wsdlスキーマを合理化しました。
  2. 最初にインポートされたスキーマ

    xjc -episode myschema.episode myschema.xsd

    ためxjcを使用してエピソードを構築し、wsimportの通過Javaクラス生成に結合

    wsimport mywsdl.wsdl -b myschema.episode

詳細についてように、そのエピソードを使用第2の解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:bindingsnode属性ポイントxs:schema要素への内部jaxws:bindings要素の子としてJAX-WS外部結合ファイル内に現れるかもしれWSDLドキュメントスキーマが処理されるとき、結果はjaxb:bindings要素がスキーマ文書内でスキーマコンポーネントの注釈としてインライン化されているかのようにしなければなりません。

WSDL文書内に埋め込まれたスキーマ文書のJAXBバインディング宣言(すなわちjaxb:bindings要素)を処理中に含有xs:schema要素は、スタンドアロンスキーマドキュメントのルートであるかのように、その内部に表示されるすべてのXPath式を解釈しなければなりません。

だから、あなたの内側の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

私はあなたの解決策を試しましたが、衝突を引き起こす2つの宣言に関して私にオリジナルのエラーを与えました。これが可能であるかどうかはわかりません。 – yogsma

関連する問題