6

JAX-WS を使用して小さな Web サービスを作成しました。WSDL ファイルには、このような TYPES 要素があります。

<types>
  <xsd:schema>
  <xsd:import namespace="http://ws.poc.mawia/" schemaLocation="http://localhost:777/ws/hello?xsd=1"/>
  </xsd:schema>
</types>

Web サービスの URL は でhttp://localhost:777/ws/hello?wsdl、XSD はhttp://localhost:777/ws/hello?xsd=1です。別の場所にある XSD スキーマ ファイルには、次のようなデータ型定義があります。

...
 ...
    <xs:complexType name="student">
     <xs:sequence>
     <xs:element name="name" type="xs:string" minOccurs="0"/>
     <xs:element name="rollNo" type="xs:int"/>
     </xs:sequence>
    </xs:complexType>
  ...
 ...

私が見たほとんどの WSDL ファイルは通常、WSDL ファイル自体の中に完全な XSD 定義を持っていますが、JAX-WS はそれを別の場所に配置しています。

これはどうあるべきですか?すべての XSD 定義を 1 つの WSDL ファイルに配置するように JAX-WS を構成するにはどうすればよいですか?

4

2 に答える 2

9

これはどうあるべきですか?

XSD を WSDL から分離することは、JAX-WS のデフォルトの動作であり、あまり心配する必要はありません。最新の WS フレームワーク (WCF を含む) は、通常、それを処理できます。XSD のサイズによっては、それをインポートすると WSDL が読みやすくなる場合があります。小さな Web サービスの場合、スキーマを埋め込んだ方が確かに簡単ですが、スキーマをインポートすることもそれほど問題ではありません。

すべての XSD 定義を 1 つの WSDL ファイルに配置するように JAX-WS を構成するにはどうすればよいですか?

ランタイムにスキーマを WSDL に埋め込む直接的な方法はわかりませんが、これを実現するための回避策があります。

  1. エンドポイントを公開し、WSDL と XSD を保存します
  2. XSD の内容をtypesWSDL のセクションに手動でコピーし、そこにあるスキーマ インポートを置き換えます。
  3. マージされた WSDL ファイルを、アプリケーションがリソースとしてアクセスできる場所に保存します。
  4. マージされた WSDL を Web サービスにロードさせます。これにより動的生成が停止しますが、インターフェースに変更を加えるたびに手動で WSDL を更新する必要があります。

4. は@WebServiceアノテーションをカスタマイズすることで実装できます。これは次のようになります。

@WebService( wsdlLocation = "MyWebService.wsdl")
public class MyWebService { .... }
于 2013-04-16T08:56:56.133 に答える