この章では、Web Service Definition Language (WSDL)ドキュメントについて、およびService Busプロジェクトでこれらのドキュメントを使用してビジネス・サービス、プロキシ・サービス、パイプラインおよび分割-結合を生成する方法について説明します。WSDLドキュメントはWebサービスの正式な記述で、サービスで何が実行できるか、サービスのある場所およびサービスの呼出し方法を定義します。
この章の構成は、次のとおりです。
WSDLドキュメントでは、サービス、サービスの場所、サービス操作、およびクライアントがサービスと通信する方法を記述します。この項では、Service Busの機能を説明する際のコンテキストを提供するために、WSDLの概要を簡単に説明します。
表11-1に、WSDLサービスの定義に使用する主な要素を示します。
表11-1 上位のWSDL要素
要素 | 説明 |
---|---|
types |
メッセージ・コンテンツの型定義。 |
message |
やり取りされるデータの抽象的な定義。メッセージはパートで構成され、パートはメッセージの理論上抽象的な内容を表します。 |
portType |
サービスでサポートされる操作の抽象的な集合。 |
operation |
サービスでサポートされるアクションの抽象的な説明。 |
binding |
ポート・タイプの具体的なプロトコルとデータ形式の指定。 |
port |
ネットワーク・アドレスとバインディングで構成される単一のエンドポイント。 |
service |
関連するポートまたはエンドポイントの集合。 |
WSDLでは、SOAP、HTTP、MIMEおよびService Bus固有のバインディング拡張が指定され、これらは、WSDLバインド・メカニズムを拡張することで、プロトコル固有またはメッセージ形式固有の機能をサポートします。
types
要素は、データ型定義のコンテナです。この要素では、XMLスキーマ(XSD)などの型システムを使用して、このサービスで処理されるメッセージのボキャブラリを定義します。たとえば、株価を提供するサービスの場合、次の例に示すように、TradePriceRequest
およびTradePrice
という用語によってXMLボキャブラリを定義できます。
例 - WSDLの型の例
<types> <schema targetNamespace="http://example.com/stockquote.xsd" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="TradePriceRequest"> <complexType> <all> <element name="tickerSymbol" type="string"/> </all> </complexType> </element> <element name="TradePrice"> <complexType> <all> <element name="price" type="float"/> </all> </complexType> </element> </schema> </types>
message
要素は、通信するデータの抽象的な型付き定義です。メッセージはパートで構成され、各パートは、メッセージの1つの論理抽象単位を表します。WSDLドキュメントでは、1つ以上のメッセージを定義でき、各メッセージには1つ以上のパートを含めることができます。たとえば、次の例のWSDLフラグメントでは、sellerInfoMessage
、buyerInfoMessage
、response
およびnegotiationMessage
の4つのメッセージ・タイプが定義されており、各メッセージ・タイプには1つ以上のパートが含まれています。
例 - WSDLメッセージの例
<message name="sellerInfoMessage"> <part name="inventoryItem" type="xsd:string"/> <part name="askingPrice" type="xsd:integer"/> </message> <message name="buyerInfoMessage"> <part name="item" type="xsd:string"/> <part name="offer" type="xsd:integer"/> </message> <message name="response"> <part name="result" type="xsd:string"/> </message> <message name="negotiationMessage"> <part name="item" type="xsd:string"/> <part name="price" type="xsd:integer"/> <part name="outcome" type="xsd:string"/> </message>
portType
要素では、(port
要素で定義された)1つ以上のエンドポイントがサポートする一連の操作を定義します(「WSDLのサービスとポート」を参照)。ポート・タイプは、サービスが提供する操作のパブリック・インタフェースを提供します。各操作は、サービスがサポートするアクションの抽象的な記述である<operation>
要素で定義されます。
たとえば、次の例では1つのオペレーションGetLastTradePrice
でポート・タイプを定義し、これは入力メッセージGetLastTradePriceInput
および出力メッセージGetLastTradePriceOuput
を処理します。次の例のsoap:operation
下位要素に示すように、これらのメッセージの具体的な記述はWSDLバインドで定義されています。
例 - WSDLのポート・タイプと操作の例
<portType name="StockQuotePortType"> <operation name="GetLastTradePrice"> <input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation> </portType>
binding
要素では、ポート・タイプの具体的なデータ・フォーマット仕様と具体的なトランスポート・プロトコルを指定します。次の例では、type
属性の値として提供されるStockQuotePortType
ポート・タイプのバインディングを指定します。soap:binding
下位要素は、このバインディングがSOAPプロトコル形式にバインドされることを示します。この下位要素では、style
属性でデータ・フォーマットがSOAPドキュメント・スタイルであることを指定し、transport
属性で転送プロトコルがHTTPであることを指定しています。
例 - WSDLのバインディングの例
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="GetLastTradePrice"> <soap:operation soapAction="http://example.com/GetLastTradePrice"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding>
service
要素では、関連するエンドポイントの集合を定義します。各エンドポイントは、port
子要素で定義されます。ポートでは、ネットワーク・アドレスに関連付けられたバインディングを定義します。次の例では、StockQuotePort
とStockQuotePortUK
の2つのポートが定義されています。この2つのポートは、(binding
で具体的に定義された)tns:StockQuoteSoapBinding
という同じバインディングを使用していますが、ネットワーク・アドレスは異なります(http://example.com/stockquote
とhttp://example.uk/stockquote
)。これらのポートは、このサービスで使用できる代替ポートです。
例 - WSDLのサービスとポートの例
<service name="StockQuoteService"> <port name="StockQuotePort" binding="tns:StockQuoteSoapBinding"> <soap:address location="http://example.com:9999/stockquote"/> </port> <port name="StockQuotePortUK" binding="tns:StockQuoteSoapBinding"> <soap:address location="http://example.uk:9999/stockquote"/> </port> </service>
Service Busでは、WSDLドキュメントは、プロキシ・サービス、ビジネス・サービス、パイプラインまたは分割-結合を記述します。既存のWSDLリソースを基にしてSOAPおよびXMLサービスを構築できます。Service Busでは、WSDLドキュメント(Webサービスを記述するためのXMLベースの仕様)を使用して、複数のタイプのビジネス・サービス、プロキシ・サービスおよびパイプラインを定義します。すべての分割-結合は、WSDLドキュメントに基づきます。WSDLドキュメントには、サービス操作、入力/出力パラメータ、およびクライアントがサービスに接続する方法が記述されます。WSDL 1.1仕様については、W3C Noteの『W3C Web Services Description Language (WSDL) 1.1』(http://www.w3.org/TR/wsdl
)を参照してください。
Oracle Service BusではWSDLに関する以下の2つの性質を考慮して、プロキシ・サービスおよびビジネス・サービスが定義されます。
インタフェース内の操作、および操作の署名のメッセージ部のタイプを定義する抽象WSDLインタフェース。
メッセージ部のメッセージへのバインディング(パッケージング)、およびメッセージのトランスポートへのバインディングを定義するバインディングWSDLインタフェース。
サービスでWSDLインタフェースが明確に定義されている場合、WSDLドキュメントを使用してサービスを定義することをお薦めします(必須ではありません)。3タイプのWSDLドキュメントを定義できます。
ドキュメント・ラップのWebサービスは、ドキュメント・スタイルのサービスとしてWSDLファイルに記述されています。ただし、いくつかの追加規約に従います。標準のドキュメント指向のWebサービス操作では、1つのパラメータまたはメッセージ部分のみを取得します(通常は、XMLドキュメントを取得します)。つまり、操作を実装するメソッドに含まれるパラメータも1つだけである必要があります。これに対して、ドキュメント・ラップのWebサービス操作では、パラメータをいくつでも取得できます。パラメータ値は、SOAPメッセージ内の1つの複合データ型にラップされます。このラップされた複合データ型は、操作の1つのドキュメントとしてWSDLドキュメントに記述されます。
Service Busサービスは、SOAPスタイル・サービスとして構成できます。次に、SOAP 1.1を使用するサンプルのドキュメント・スタイルWebサービスWSDLの例を示します。
例 - ドキュメント・スタイルのサンプルWebサービスのWSDL
<definitions name="Lookup" targetNamespace="http://example.com/lookup/service/defs" xmlns:tns="http://example.com/lookup/service/defs" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:docs="http://example.com/lookup/docs" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xs:schema targetNamespace="http://example.com/lookup/docs" elementFormDefault="qualified"> <xs:element name="PurchaseOrg" type="xs:string"/> <xs:element name="LegacyBoolean" type="xs:boolean"/> </xs:schema> </types> <message name="lookupReq"> <part name="request" element="docs:purchaseorg"/> </message> <message name="lookupResp"> <part name="result" element="docs:legacyboolean"/> </message> <portType name="LookupPortType"> <operation name="lookup"> <input message="tns:lookupReq"/> <output message="tns:lookupResp"/> </operation> </portType> <binding name="LookupBinding" type="tns:lookupPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="lookup"> <soap:operation/> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> </definitions>
このサービスには、lookup
という操作(Javaクラスのメソッドに相当)が含まれています。バインディングは、これがSOAP 1.1ドキュメント・スタイルWebサービスであることを示しています。
前述のWSDLドキュメントをリクエストに使用したときに、ドキュメント・スタイルのプロキシ・サービスが取得するbody変数($body
)の値を次の例に示します。
注意:
わかりやすくするために、次のコード・リストではXMLからネームスペース宣言を削除しています。
例 - body変数の値
<soap-env:body> <req:purchaseorg>Oracle</req:purchaseorg> </soap-env:body>
前述の例では、soap-env
は定義済のSOAP 1.1ネームスペースで、req
はPurchaseOrg
要素のネームスペース(http://example.com/lookup/docs
)です。
プロキシ・サービスによるルーティング先となるビジネス・サービスで前述のWSDLファイルを使用した場合、前述のbody変数($body
)の値はプロキシ・サービスのbody変数($body
)の値になります。
呼び出されたビジネス・サービスからプロキシ・サービスが受信するレスポンスのbody変数($body
)の値を次の例に示します。
注意:
わかりやすくするために、次のコード・リストではXMLからネームスペース宣言を削除しています。
例 - body変数の値
<soap-env:body> <req:legacyboolean>true</req:legacyboolean> </soap-env:body>
これは、このWSDLファイルを使用するプロキシ・サービスによって返されるレスポンスのbody変数($body
)の値でもあります。
使用可能な多くのツールでは、プロキシ・サービスのWSDLファイル(ブラウザで、プロキシ・サービスのURLに?WSDL
接尾辞を追加することによって取得)を受け取り、適切なリクエスト・パラメータとレスポンス・パラメータを持つJavaクラスを生成して、サービスの操作を呼び出します。このJavaクラスを使用して、このWSDLファイルを使用するプロキシ・サービスを呼び出すことができます。
プロキシ・サービスとビジネス・サービスは、RPCスタイルのサービスとして構成できます。次に、SOAP 1.1を使用するサンプルのRPCスタイルWebサービスWSDLファイルの例を示します。
例 - RPCスタイルのサンプルWebサービスのWSDLファイル
<definitions name="Lookup" targetNamespace="http://example.com/lookup/service/defs" xmlns:tns="http://example.com/lookup/service/defs" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:docs="http://example.com/lookup/docs" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xs:schema targetNamespace="http://example.com/lookup/docs" elementFormDefault="qualified"> <xs:complexType name="RequestDoc"> <xs:sequence> <xs:element name="PurchaseOrg" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="ResponseDoc"> <xs:sequence> <xs:element name="LegacyBoolean" type="xs:boolean"/> </xs:sequence> </xs:complexType> </xs:schema> </types> <message name="lookupReq"> <part name="request" type="docs: RequestDoc"/> </message> <message name="lookupResp"> <part name="result" type="docs: ResponseDoc"/> </message> <portType name="LookupPortType"> <operation name="lookup"> <input message="tns:lookupReq"/> <output message="tns:lookupResp"/> </operation> </portType> <binding name="LookupBinding" type="tns:lookupPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="lookup"> <soap:operation/> <input> <soap:body use="literal" namespace="http://example.com/lookup/service"/> </input> <output> <soap:body use="literal" namespace="http://example.com/lookup/service"/> </output> </operation> </binding> </definitions>
前述のサービスには、lookup
という操作(Javaクラスのメソッドに相当)が含まれています。バインディングは、これがSOAP RPC Webサービスであることを示しています。つまり、このWebサービスの操作では、一連のリクエスト・パラメータを受け取り、一連のレスポンス・パラメータを返します。lookup
操作には、request
というパラメータとresult
という戻りパラメータがあります。バインディングにおける操作のネームスペースは次のとおりです。
http://example.com/lookup/service/defs
前述のサンプルRPCスタイルWebサービスの例のWSDLファイルに示されたWSDLドキュメントをリクエストに使用したときに、SOAP RPCプロキシ・サービスが取得するbody変数($body
)の値を次の例に示します。
注意:
わかりやすくするために、次のコード・リストではXMLからネームスペース宣言を削除しています。
例 - body変数の値
<soap-env:body> <ns:lookup> <request> <req:purchaseorg>Oracle</req:purchaseorg> </request> </ns:lookup> <soap-env:body>
ここで、soap-env
は定義済のSOAP 1.1ネームスペース、ns
は操作のネームスペース(http://example.com/lookup/service
)、req
はPurchaseOrg
要素のネームスペース(http://example.com/lookup/docs
)です。
プロキシ・サービスによるメッセージのルーティング先となるビジネス・サービスで前述の例のWSDLファイルを使用した場合、次の例に示すbody変数($body
)の値は、プロキシ・サービスのbody変数($body
)の値になります。
このWSDLドキュメントがリクエストに使用された場合に、呼び出されたビジネス・サービスから、プロキシ・サービスが受信するレスポンスのbody変数($body
)の値を次の例に示します。
例 - body変数の値
<soap-env:body> <ns:lookupResponse> <result> <req:legacyboolean>true</req:legacyboolean> </result> </ns:lookupResponse> <soap-env:body>
これは、このWSDLファイルを使用するプロキシ・サービスによって返されるレスポンスのbody変数($body
)の値でもあります。
使用可能な多くのツールでは、プロキシ・サービスのWSDLファイル(ブラウザで、プロキシのURLに?WSDL
接尾辞を追加することによって取得)を受け取り、適切なリクエスト・パラメータとレスポンス・パラメータを持つJavaクラスを生成して、サービスの操作を呼び出します。このようなJavaクラスを使用して、このWSDLファイルを使用するプロキシ・サービスを呼び出すことができます。
WSDLドキュメントを使用する利点は次のとおりです。
システムでWSDLドキュメントの各操作のメトリックを提供できます。
パイプラインで操作ブランチが可能になります。詳細は、「パイプラインの分岐」を参照してください。
SOAP 1.1サービスの場合、プロキシ・サービスが呼び出すサービスにSOAPAction
ヘッダーが自動的に作成されます。SOAP 1.2サービスの場合、プロキシ・サービスが呼び出すサービスにContent-Type
ヘッダーのaction
パラメータが自動的に作成されます。
WS-Securityを使用するサービスにはWSDLファイルが必要です。WS-PolicyはWSDLファイルに添付されます。
システムが<url>?WSDL
構文をサポートしているため、HTTPプロキシ・サービスのWSDLファイルを動的に取得できます。これは、多くのSOAPクライアント生成ツールにとって便利です。詳細は、「WebブラウザでのService Busリソースの表示」を参照してください。
XQueryエディタ、XPathエディタおよび条件ビルダーでは、プロキシ・サービスのWSDLファイルのリクエスト・メッセージにbodyコンテンツ変数($body
)がデフォルトでマップされるため、$body
の操作が容易になります。「メッセージ・コンテキスト」を参照してください。
特定のアクションにおける$body
の実行時のコンテンツが、エディタに表示されるデフォルト・マッピングと異なる場合があります。これは、Service Busが型付きの変数を宣言して使用するプログラミング言語ではないためです。変数は型なしであり、値が割り当てられると実行時に動的に作成されます。また、変数の型は、メッセージ・フローの任意の位置でコンテンツに基づく型になります。XQuery式およびXPath式を容易に作成できるように、エディタでは、指定した変数をエディタで型にマップすることによって、その変数の型をマップできます。XQueryエディタおよびXPathエディタを使用して式を作成する方法については、「変数の構造での作業」を参照してください。
Service Busでは、WSDLリソースと呼ばれる既存のWSDLファイルに基づいて新しいサービスを作成し、構成プロパティをオーバーライドしたり追加したりできます。実行時、Service Busでは、WSDLリソースの構成と追加のトランスポートやランタイム構成を含む、サービスの有効なWSDLドキュメントを生成します。
WSDLベースのサービスの場合、Service Busでは、Service Busサービスの開発時に作成する実際の.wsdl
ファイルのかわりに、有効なWSDLドキュメントを実行時に使用します。有効なWSDLドキュメントとは、Service Busで構成されたサービスのWSDLプロパティであり、この中には、ソースWSDLドキュメントの外部で構成された追加プロパティも含まれます。ソースWSDLドキュメントは、有効なWSDLドキュメントのテンプレートとして機能します。
サービスをWSDLドキュメントに基づいて作成する場合、Service Busでは、元のWSDLドキュメントのプロパティ、構成したトランスポート・プロパティ、ランタイムの設定(ターゲット・サーバーなど)および任意のWS-Policy構成を組み合せて、有効なWSDLドキュメントを実行時に生成します。実行時に元のWSDLドキュメントに対して追加または変更したプロパティは、有効なWSDLドキュメントに含まれます。新しい構成で使用されないソースWSDLドキュメントのプロパティは、有効なWSDLドキュメントから省かれます。
Service Busでは、WSDLドキュメントから作成され、WSDLベースのサービスをサポートするトランスポート(HTTP、JMS、SBなど)を使用するSOAPおよびXMLサービスに対して有効なWSDLドキュメントを生成できます。Service Busでは、タイプが任意のSOAP、任意のXMLおよびメッセージングのサービスに対しては、有効なWSDLドキュメントを生成できません。
有効なWSDLドキュメントは、プロキシ・サービスとビジネス・サービス、およびWSDLポートに基づくサービスとWSDLバインドに基づくサービスに対して異なる特性を備えています。詳細は、「WSDLポートとWSDLバインドに基づくサービス」を参照してください。
WSDLリソースに基づいてサービスを作成する場合、サービスはWSDLポートまたはWSDLバインドに基づいている必要があります。
WSDLリソースのバインティングに基づいて新しいサービスを作成する場合は、WSDLリソースで選択したbinding
要素で定義されているプロトコルとデータ・フォーマットを選択します。
WSDLリソースのポートに基づいて新しいサービスを作成する場合は、port
要素で定義されているバインディングとネットワーク・アドレスを選択します。
サービスを作成または変更するときに、トランスポートは変更できますが、データ・フォーマットはオーバーライドできません。元のWSDLリソースのポート定義とバインディング定義は、次の項で説明するように、様々な要因に応じて有効なWSDL内で変更されます。
プロキシ・サービス用に生成される有効なWSDLドキュメントには、次の特性が適用されます。
有効なWSDLドキュメントに含まれるwsdl:service
セクションは1つのみです。
wsdl:service
セクションに含まれるwsdl:port
セクションは1つのみです。
SOAPサービスの場合、既存の<wsdl:service>
定義が削除され、<wsdl:port>
が1つ含まれた新しいサービス定義が作成されます。
サポートされているすべてのトランスポートのSOAPバインディングでは、wsdl:binding
セクションに標準のWSDL SOAPバインディング要素と、トランスポートを識別する一意のトランスポートURIが含まれます。
XML over HTTPバインディングでは、wsdl:binding
セクションでWSDL 1.1仕様で指定された標準のバインディング要素が使用されます。
サポートされている他のすべてのトランスポートのXMLバインディングでは、wsdl:binding
セクションでOracle (Service Bus)独自のWSDL XMLバインディング要素が使用されます。
サービスがバインディングに基づく場合、次の特性が適用されます。
有効なWSDLドキュメントでは、新しいサービスとポート(<bindingname>QSService
および<bindingname>QSPort
)を定義します。WSDLリソースで定義されているポートは、有効なWSDLドキュメントには含まれません。
そのバインディングに関連付けられたWSDLドキュメントに複数のポートが含まれている場合があります。ポートごとに異なるURLを使用できます。そのため、有効なWSDLドキュメントではこのバインディングが使用されますが、バインディングに対応するサービスの構成から代用ポートが生成されます。他のポートはすべて削除されます。
サービスがポートに基づく場合、次の特性が適用されます。
サービスの基準となるポートも有効なWSDLドキュメントで定義されます。WSDLリソースで定義されているその他のポートは含まれません。また、WSDLポートに基づいてプロキシ・サービスを作成した場合、有効なWSDLドキュメントではそのポート名が使用されます。バインディングはポートから決定され、ポート・タイプはバインディングから決定されます。
有効なWSDLドキュメントには、WSDLリソースで定義されているポートに関連付けられたすべてのWS-Policyが保持されます。
ソースWSDLドキュメントのポート定義で指定されているトランスポート・アドレスは、有効なWSDLドキュメントでプロキシ・サービスのアドレスとしては使用されません。
HTTPサービスの場合、トランスポートを構成するときにトランスポート・アドレスを指定する必要があります。このアドレスが、有効なWSDLドキュメントのポート定義で使用されます。
Service Busは常にプロキシ・サービスをホストするため、プロキシ・サービスのトランスポート・アドレスとして指定したURLは、常にService Busドメイン内のパスからの相対位置になります。
SOAPプロトコルのWSDLサービスの場合、SOAPバインディングのトランスポートURIはトランスポートの実装によって異なります。標準のトランスポート(HTTPやJMSなど)の場合、この値はSOAP仕様または汎用的に受け入れられる別の値に従います。SOAPで標準の値が定義されていないトランスポートの場合、Service Busは末尾にトランスポートIDを付加した定義済のネームスペース(http://www.oracle.com/transport/2007/05/
)で構成される値を設定します。
有効なWSDLドキュメントに含まれるサービス要素は1つで、ポート・アドレスには、バインディングで選択されているトランスポートで構文とセマンティクスが定義されたURLが含まれます。
トランスポート型ではないビジネス・サービス用に生成される有効なWSDLドキュメントには、次の特性が適用されます。
有効なWSDLドキュメントに含まれるwsdl:service
セクションは1つのみです。
wsdl:service section
には、複数のwsdl:port
セクションが含まれる場合があります。通常、これが該当するのは、ロード・バランシングを使用しており、サポートされるロード・バランシング・アルゴリズムのいずれかを使用することによって使用できる複数のエンドポイント・アドレスが存在する場合です。
サポートされているすべてのトランスポートのSOAPバインディングでは、wsdl:binding
セクションに標準のWSDL SOAPバインディング要素と、トランスポートを識別する一意のトランスポートURIが含まれます。
サポートされているすべてのトランスポートのXMLバインディングでは、wsdl:binding
セクションにOracleのWSDL XMLバインディング要素が含まれます。
トランスポート・アドレスとして指定されたURLは、リモート・サービスがホストされるリモートの場所を示します。
サービスがポートに基づく場合、次の特性が適用されます。
有効なWSDLドキュメントでは、ソースWSDLドキュメントのポートと同じ名前のポートが定義されます。ビジネス・サービスに複数のエンドポイント・アドレスが構成されている場合、そのサービスから生成される有効なWSDLドキュメントですべてのエンドポイントのポートが<portname_in_template>_1、<portname_in_template>_2、...
(以降も同様)という名前で定義されます。
新しいサービスのバインディングはポートから決定され、ポート・タイプはバインディングから決定されます。
トランスポート・アドレスのURLは、リモート・サービスがホストされるリモートの場所を示します。
サービスがバインディングに基づく場合、次の特性が適用されます。
有効なWSDLドキュメントでは、WSDLリソースのポートに基づいて新しいサービスとポートが定義されます。WSDLリソースで定義されているポートは、有効なWSDLファイルには含まれません。
WSDLリソースのバインディングが複数のポートに関連付けられている場合があります。ポートごとに異なるURLを使用でき、それぞれ異なるWS-Policyを添付できます。そのため、生成されるWSDLドキュメントではこのバインディングが使用されますが、バインディング用にWS-Policyが添付されていない代用ポートが生成されます。
XMLベースのWSDLサービスでは、サービスでHTTPトランスポートを使用している場合にのみ、標準のHTTPバインディングが使用されます。XMLベースのWSDLファイルから作成される他のすべてのサービスでは、有効なWSDLドキュメントでOracleバインディングが使用されます。
Service Busは、トランスポート型ビジネス・サービス用に生成される有効なWSDLドキュメントのwsdl:service
セクションが1つのみであることを保証しません。WSDLドキュメントはトランスポートによって生成されるため、Service Busがserviceセクションとportセクションを生成することはなく、クリーンアップも行いません。ただし、Service Busは依存関係を評価し、エクスポート時にその参照を設定します。
次の例では、WSDLリソースのポート定義とバインディング定義のフラグメントを示します。
例 - WSDLリソース
<portType name="StockQuotePortType"> ... </portType> <binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ... </binding> <service name="StockQuoteService"> <port name="StockQuotePort" binding="tns:StockQuoteSoapBinding"> <soap:address location="http://example.com:9999/stockquote"/> </port> <port name="StockQuotePortUK" binding="tns:StockQuoteSoapBinding"> <soap:address location="http://example.uk:9999/stockquote"/> </port> </service>
ポートとバインディングに基づくプロキシ・サービスの例の例に基づいてプロキシ・サービスを作成すると、有効なWSDLドキュメントは次の例のフラグメントのようになります。
例 - ポートに基づいたプロキシ・サービスの有効なWSDLファイル
<binding name="StockQuoteSoapBinding" type="ns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ... </binding> <service name="StockQuoteService"> <port name="StockQuotePort" binding="ns:StockQuoteSoapBinding"> <soap:address location="http://host:port/project/proxyname"/> </port> </service>
この例について、次の点に注意してください。
テンプレートと有効なWSDLドキュメントのサービス名(StockQuoteService
)は同じです。
テンプレートと有効なWSDLドキュメントのバインディングは同じです。この例のバインディングでは、サービスがSOAPドキュメント・スタイルのメッセージにHTTP転送プロトコルを使用することを指定しています。この例では示されていませんが、WSDLリソースと有効なWSDLドキュメントでは、同じバインディング操作も指定されています。
WSDLリソースで定義されている2つ目のポートStockQuotePortUK
は、有効なWSDLドキュメントでは定義されていません。
WSDLリソースのポートで定義されているトランスポート・アドレス(URI) http://example.com:9999/stockquote
は、有効なWSDLのポートで生成されたアドレスhttp://host:port/
project_path
/proxy_service_name
とは異なります。有効なWSDLドキュメントでは、その構成時にトランスポートに指定したアドレスが使用されます。
「ポートとバインディングに基づくプロキシ・サービスの例」にStockQuoteBinding
バインディングに基づくプロキシ・サービスを作成すると、有効なWSDLドキュメントは次の項のフラグメントのようになります。
例 - バインディングに基づいたプロキシ・サービスの有効なWSDLドキュメント
<binding name="StockQuoteSoapBinding" type="ns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> ... </binding> <wsdl:service name="StockQuoteSoapBindingQSService" <wsdl:port name="StockQuoteSoapBindingQSPort" binding="ns:StockQuoteSoapBinding"> <soap:address location="http:/host:port/project/proxyname"/> </wsdl:port> </wsdl:service>
この例について、次の点に注意してください。
WSDLリソースのサービスとポートは、有効なWSDLドキュメントで生成されたサービスとポートとは異なります。
WSDLリソースと有効なWSDLドキュメントのサービス名は異なります。テンプレートではStockQuoteService
、有効なWSDLドキュメントではStockQuoteSoapBindingQSService
です。
WSDLリソースと有効なWSDLドキュメントのバインディングは同じです。この例のバインディングでは、サービスがSOAPドキュメント・スタイルのメッセージにHTTP転送プロトコルを使用することを指定しています。
この例では示されていませんが、テンプレートと有効なWSDLドキュメントでは、同じバインディング操作も指定しています。
WSDLリソースのポートで定義されているトランスポート・アドレス(URI)http://example.com:9999/stockquote
は、有効なWSDLのポートで生成されたアドレスhttp://
host:port/project
/stockquote
とは異なります。
WSDLドキュメントをエクスポートすると、有効なWSDLドキュメントおよび関連付けられた依存関係(XMLスキーマなど)を含むJARファイルが生成されます。Service Busはこの依存関係を評価し、WSDLのimport
要素のlocation
属性に適切な場所が追加されます。生成されたWSDLドキュメントをエクスポートすることはできません。
リソースのインポートとエクスポートの詳細は、「リソースおよび構成のインポートとエクスポート」を参照してください。
JDeveloperでは、JCAアダプタに基づいて新しいプロキシ・サービスやビジネス・サービスを作成すると、WSDLファイルが生成されてService Busプロジェクトに追加されます。WSDLファイルは、標準のJDeveloperツールを使用して最初から作成することもできます。WSDLファイルは、Oracle Service Busコンソールでは生成されません。必要なWSDLファイルをサービスで使用するには、そのファイルをインポートする必要があります。
WSDLファイルは、JDeveloperの標準機能です。WSDLファイルの作成に使用するエディタとツールの詳細は、『Oracle JDeveloperによるアプリケーションの開発』のXMLを使用したアプリケーションの開発に関する項を参照してください。
作成するWSDLリソースに、JDeveloperに現在存在しない外部スキーマへのURL参照(http://www.w3.org/2001/XMLSchema.xsd
など)が含まれている場合、XMLスキーマのリソースを作成することによって、それらのURL参照付きスキーマと依存するすべてのスキーマをService Busに追加する必要があります。Service BusのWSDLリソースは、ローカルで使用可能なスキーマのみを参照できます。WSDLファイルは、XMLスキーマ定義(XSD)ファイルまたはサンプル・ファイルを使用して生成できます。
新しいWSDLドキュメントの入力タイプと出力タイプを定義するには、メッセージ・パートにXMLタイプを指定する必要があります。ローカル・ファイル・システムに存在するスキーマXSDファイルを使用する場合、XSDファイルと、そのファイルがインポートするXSDファイルのすべてがJDeveloperのプロジェクト・ディレクトリにあることを確認します。これで、スキーマがプロジェクトとともにデプロイされて実行時に使用可能になります。
JDeveloperでWSDLドキュメントを作成するには:
次のいずれかを行います:
新しいWSDLリソースを作成するには、アプリケーション・ナビゲータで、新しいWSDLファイルの配置先のプロジェクトまたはフォルダを右クリックします。「新規」をポイントし、「SOA WSDLドキュメント」を選択します。
新しいWSDLリソースをサービスの作成ウィザード内から作成するには、「WSDL」フィールドの右側の「WSDLの生成」アイコンをクリックします。
「WSDLの作成」ダイアログが表示されます。
「WSDLの作成」ダイアログで、WSDLファイルの一意の名前を入力して、ファイルの保存先のディレクトリを入力するか、デフォルトのままにします。
デフォルトでは、ファイルはプロジェクト・フォルダに格納されます。これは、現在のプロジェクト・ディレクトリまたはそのサブディレクトリのいずれかにしてください。指定のディレクトリが存在しない場合、Oracle JDeveloperでディレクトリが作成されます。
「ネームスペース」フィールドに、WSDLファイルのネームスペース・アドレス(http://example.com/OrderProcess/wsdl
など)を入力します。
指定するネームスペースは、WSDLファイルでtns
ネームスペースとして定義されます。
「バインディング」フィールドに、サービス用に作成する、WSDLファイルのバインディングの名前を入力します。使用可能なオプションのリストから、バインディング・タイプを選択します(SOAP 1.1、SOAP 1.2またはXML)。
「ポート・タイプの作成」を選択してWSDLドキュメントの新しいポート・タイプと操作を作成するか、「ポート・タイプの選択」を選択して既存のWSDLドキュメントからポート・タイプを選択します。
次のいずれかを行います:
「ポート・タイプ」フィールドに、使用する操作を含むポート・タイプの名前を入力します。
「操作」フィールドに、使用する操作の名前を入力します。
注意:
操作名やポート・タイプで、空白や特殊文字は使用できません。アルファベットおよび数字のみがサポートされますが、最初の文字に数字は使用できません。
「インタフェース・タイプ」フィールドで、リクエスト専用メッセージングの場合は「一方向インタフェース」を選択し、リクエスト/レスポンス・メッセージングの場合は「同期インタフェース」を選択します。
使用可能なフィールドは、選択内容に応じて異なります。
「入力」フィールドの右上の「新規メッセージ・パートを追加します。」をクリックします。
「メッセージ・パートの追加」ダイアログで、次のようにします。
「パート名」フィールドに、メッセージ・パートの名前を入力します。
「URL」フィールドの右側で、「スキーマ・ファイルを参照」アイコンをクリックし、XMLタイプを参照して選択します。
「タイプ・チューザ」ダイアログが表示され、選択元のスキーマとWSDLファイルのリストが表示されます。
「タイプ・エクスプローラ」ツリーを開き、使用するスキーマ・ルート要素を見つけて選択し、「OK」をクリックします。
「メッセージ・パートの追加」ダイアログが再度表示され、「URL」と「スキーマ要素」フィールドに「タイプ・チューザ」ダイアログからのデータが移入されます。XSD単純型を選択した場合、「スキーマ要素」フィールドは「単純型」フィールドで置き換えられます。
ヒント:
使用するスキーマが、作業しているプロジェクトにない場合、「スキーマ・ファイルのインポート」またはダイアログの右上隅にある「WSDLのインポート」アイコンを使用して、スキーマXSDファイルまたはWSDLファイルをプロジェクトにインポートできます。
「OK」をもう一度クリックします。
「WSDLの作成」ダイアログの「入力」フィールドに新しいメッセージ・パート情報が表示されます。
必要に応じて、前述の手順を繰り返して、追加のメッセージ・パートを定義します。
インタフェース・タイプに「同期インタフェース」を選択した場合、前述の手順を繰り返して、出力およびフォルト・メッセージ・パートを定義します。
「OK」をクリックします。
注意:
パートナ・リンク・タイプは、通常BPELで使用されるため、Service Busに「partnerlinkType拡張機能の生成」を選択する必要はありません。
生成WSDLファイルとは、WSDLリソースで開始されなかったが、WSDLファイルを使用して記述できるサービスのためにService Busが生成するWSDLファイル・リソースです。EJBまたはJEJBトランスポート型のビジネス・サービスやJEJBプロキシ・サービスに関連付けられたWSDLファイルを生成できます。
JDeveloperでサービスからWSDLファイルを生成するには:
WSDLドキュメントを作成すると、JDeveloperで標準のXMLエディタを使用してこれらをさらに構成できます。WSDLドキュメントの表示と構成に使用するエディタおよびツールの詳細は、『Oracle JDeveloperによるアプリケーションの開発』のXMLを使用したアプリケーションの開発に関する項を参照してください。
Oracle Service Busコンソールを使用する場合、WSDLドキュメントを作成するには、ドキュメントをインポートするかWSDLリソースを作成します。インポートの詳細は、「リソースおよび構成のインポートとエクスポート」を参照してください。WSDLリソースを手動で作成するには、次の手順を実行します。WSDLリソースにアップロードする既存のWSDLファイルが必要です。
作成するWSDLリソースに、Service Busで現在存在しない外部スキーマへのURL参照(http://www.w3.org/2001/XMLSchema.xsd
など)が含まれている場合、XMLスキーマのリソースを作成することによって、それらのURL参照付きスキーマと依存するすべてのスキーマをOracle Service Busコンソールにインポートする必要があります。Service BusのWSDLリソースは、ローカルで使用可能なスキーマのみを参照できます。
コンソールでWSDLリソースを作成するには:
セッションをまだ作成していない場合は、「作成」をクリックして新しいセッションを作成するか、「編集」をクリックして既存のセッションを入力します。
プロジェクト・ナビゲータで、新しいWSDLドキュメントを含めるプロジェクトまたはフォルダを右クリックして、「作成」をポイントし、「リソース」を選択します。「インタフェース」をクリックし、「WSDL」をクリックして「OK」をクリックします。
「WSDLの作成」ダイアログが表示されます。
次のいずれかを行います:
既存のWSDLファイルからリソースを作成するには、「ファイルのアップロード」フィールドの横の「参照」をクリックしてから、使用するWSDLファイルに移動してそのファイルを選択します。
「リソース名」フィールドに、ファイル拡張子なしのファイル名が自動的に移入されます。この名前は変更可能です。
新しいWSDLファイルを作成するには、WSDLリソースの一意の名前を入力します。
必要に応じて、リソースの簡単な説明を入力します。
「作成」をクリックします。
WSDL要素(定義される場合)がWSDL定義エディタに表示されます。
WSDLファイルのコンテンツを変更するには、次のようにします。
ツールバーの「ソースの編集」をクリックします。
「ソースの編集」ダイアログが表示されます。
アップロードする新しいWSDLファイルを参照して選択するには、「参照」をクリックします。
ファイルのコンテンツを変更するには、ダイアログの「コンテンツ」セクションでコードを直接更新します。
「保存」をクリックします。
WSDL定義エディタのツールバーで、「保存」をクリックします。
新しいWSDLドキュメントに未解決の参照がある場合は、エディタのタイトル・バーの横に「競合」アイコンが表示されます。戻る矢印と次に進む矢印ボタンを使用して、エラー全体をスクロールします。
セッションを終了して構成をランタイムにデプロイするには、「アクティブ化」をクリックします。
プロジェクトまたはフォルダ定義エディタを使用して、プロキシ・サービスやビジネス・サービスに関連付けられたWSDLファイルをエクスポートします。Service Busでは、WSDLファイルはJARファイルとしてエクスポートされます。WSDLファイルは、セッション外にいるときのみエクスポートできます。
WSDLドキュメントをエクスポートすることで、これをIDEなどの外部ツールで消費できるようにします。WSDLエクスポート機能は、2つのドメイン間でリソースを移動およびステージングする場合に使用するリソースのエクスポート機能とは異なります。この機能は、すべてのサービス・タイプに使用できるわけではありません。
生成WSDLファイルとは、WSDLリソースで開始されなかったが、WSDLファイルを使用して記述できるサービスのためにService Busが生成するWSDLファイル・リソースです。プロジェクトまたはフォルダ定義エディタを使用して、EJBまたはJEJBトランスポート型のビジネス・サービスやJEJBプロキシ・サービスに関連付けられたWSDLファイルを生成します。WSDLファイルを生成するには、セッション内で作業している必要があります。
コンソールでビジネス・サービスからWSDLファイルを生成するには:
Oracle Service BusコンソールでWSDLリソースを作成すると、ファイルを必要に応じて変更できますが、その方法はソース・コードを直接変更するのみです。
WSDLドキュメントを編集するには:
設計時のWSDLドキュメントと有効なWSDLドキュメントの両方をWebブラウザで表示できます。ブラウザ・ウィンドウからファイルにアクセスすると、ファイルのコンテンツがXML形式で表示されます。
有効なWSDLドキュメントには、次の3通りの方法でアクセスできます。
Webブラウザで、次の構文を使用して固定HTTP URLを入力します。
http://host:port/sbresource?PROXY/project_path/proxy_service_name
または
http://host:port/sbresource?BIZ/project_path/business_service_name
この方法は、Service Busが、有効なWSDLドキュメントを生成できるサービスすべてに使用できます。
Webブラウザで、HTTPベースのプロキシ・サービスのURLの末尾に?WSDL
を付加して入力します。
この方法は、Service Busが、有効なWSDLドキュメントを生成できるHTTPトランスポートベースのサービスでのみ使用できます。
WSDLリソースをエクスポートします。詳細は、「コンソールでのWSDLファイルのエクスポート方法」および「コンソールでのサービスからのWSDLファイルの生成方法」を参照してください。一般的なエクスポートについての情報は、「リソースおよび構成のインポートとエクスポート」を参照してください。
Service Busでは、URLを介してService Busに登録されたリソースを表示するために使用されるリソース・サーブレットが提供されます。URLを使用したService Busリソースへのアクセスの詳細は、「WebブラウザでのService Busリソースの表示」を参照してください。
設計時のWSDLドキュメントを表示するには、次の構文を使用してURLを入力します。
http://host:port/sbresource?WSDL/project_path/wsdl_name