30

これは私の現在の構成です:

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://stock.com/schemas/services/stock"
    xmlns:tns="http://stock.com/schemas/services/stock"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified"  targetNamespace="http://stock.com/schemas/services/stock">

<xsd:element name="Stock">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="ticker" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="quotes" nillable="true" type="Quote"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

<xsd:complexType name="Quote">
    ........
</xsd:complexType>
.......
<xsd:element name="gethighBetaStockResponse">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

WSDL

<?xml version="1.0" encoding="UTF-8"?><definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
<import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
<message name="getStockQuoteResp">
    <part name="parameters" element="external:getStockQuoteResponse" />
</message>

ただし、ref="Stock"がtype="Stock"に変更されると、wsdl2javaはType {http://stock.com/schemas/services/stock} Stockを参照し始めますが、定義されていません。

どういうわけか、wsdlとxsdのインポートが衝突しているように見えますが、解決できません。ヘルプをいただければ幸いです。

4

2 に答える 2

27

ここにはいくつかの問題があります。

まず、XSD には、要素が名前付けまたは参照されているという問題があります。あなたの場合は参照する必要があります。

変化する:

<xsd:element name="stock" ref="Stock" minOccurs="1" maxOccurs="unbounded"/> 

に:

<xsd:element name="stock" type="Stock" minOccurs="1" maxOccurs="unbounded"/> 

と:

  • グローバル要素の宣言を削除しますStock
  • という名前の型の複合型宣言を作成しますStock

そう:

<xsd:element name="Stock">
    <xsd:complexType>

に:

<xsd:complexType name="Stock">

xml の終了タグを必ず修正してください。

2 つ目の問題は、外部 XSD を参照する正しい方法は、wsdl:types 要素内で import/include を指定して XSD スキーマを使用することです。wsdl:import は、他の WSDL ファイルを参照するために予約されています。詳細については、WS-I 仕様のセクションWSDL およびスキーマのインポートを参照してください。WS-I に基づいて、ケースは次のようになります。

不正解: (あなたが示した方法)

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
    <import namespace="http://stock.com/schemas/services/stock" location="Stock.xsd" />
    <message name="getStockQuoteResp">
        <part name="parameters" element="external:getStockQuoteResponse" />
    </message>
</definitions>

正しい:

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="http://stock.com/schemas/services/stock/wsdl"
    .....xmlns:external="http://stock.com/schemas/services/stock"
    <types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://stock.com/schemas/services/stock" schemaLocation="Stock.xsd" />             
        </schema>
    </types>
    <message name="getStockQuoteResp">
        <part name="parameters" element="external:getStockQuoteResponse" />
    </message>
</definitions>

一部のプロセッサは、両方の構文をサポートする場合があります。あなたが出した XSD は問題を示しています。最初に XSD を検証してください。

WSDL のオーサリングに関しては、WS-I の方法を採用した方がよいでしょう。

その他の問題は、外部コンテンツを検索する際の相対 URI と絶対 URI の使用に関連している可能性があります。

于 2012-08-25T21:47:42.630 に答える
11

インポートとインクルード

インポートの主な目的は、名前空間をインポートすることです。XSD import ステートメントのより一般的な用途は、別のファイルに表示される名前空間をインポートすることです。ファイルから名前空間情報を収集している可能性がありますが、インポートしているのはファイルではなく名前空間であることを忘れないでください(ステートメントとステートメントを混同しないでください)。importinclude

混乱を招くもう 1 つの領域は、インクルード ファイルの場所またはパスを指定する方法.xsdですschemaLocation。import ステートメント自体。

.xsdWSDL に外部ファイルを使用することを選択した場合、schemaLocation属性が必要になります。import ステートメントで使用する名前空間が、インポートするスキーマの targetNamespace と同じであることを確認してください。つまり、3 つのオカレンスはすべて同一でなければなりません。

WSDL:

xs:import namespace="urn:listing3" schemaLocation="listing3.xsd"/>

XSD:

<xsd:schema targetNamespace="urn:listing3"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

XSD に関する WSDL を知らせるもう 1 つの方法は、Maven の pom.xml を使用することです。

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>xmlbeans-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>generate-sources-xmlbeans</id>
      <phase>generate-sources</phase>
      <goals>
    <goal>xmlbeans</goal>
      </goals>
    </execution>
  </executions>
  <version>2.3.3</version>
  <inherited>true</inherited>
  <configuration>
    <schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
  </configuration>
</plugin>

詳細については、この優れた IBM の記事を参照してください。のようなタイプミスがxsd:importありますxs:importが、それ以外は問題ありません。

于 2013-10-01T17:22:15.590 に答える