| Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング 11g リリース1 (10.3.6) B61633-05 |
|
![]() 前 |
![]() 次 |
この章では、Java API for XML Web Services (JAX-WS)を使用したWebLogic Webサービスで、Web Services Addressing (WS-Addressing)を使用する方法について説明します。
この章の内容は以下のとおりです。
WS-Addressingは、Webサービスおよびそれに関連するメッセージをアドレッシングするための、トランスポートに依存しないメカニズムを提供します。WS-Addressingを使用すると、エンドポイントはSOAPヘッダー内で一意かつ明確に定義されます。
WS-Addressingには、トランスポートに依存しないアドレッシングを可能にする次の2つの主要なコンポーネントがあります。
エンドポイント参照(EPR): Webサービス・エンドポイントのアドレッシングに必要な情報を通知します。
メッセージ・アドレッシング・プロパティ: エンドツーエンドのメッセージ特性(ソースおよび宛先のエンドポイントとメッセージIDへのアドレッシングなど)を通知します。これにより、メッセージに対して基礎となるトランスポートからは独立した共通のアドレッシングが可能になります。
メッセージ・アドレッシング・プロパティには、表2-1に定義されているプロパティを1つ以上含めることができます。wsa:Action以外のプロパティはすべてオプションです。
表2-1 WS-Addressingのメッセージ・アドレッシング・プロパティ
| コンポーネント | 説明 |
|---|---|
|
|
宛先。指定しない場合は、デフォルトの宛先( |
|
|
ソース・エンドポイント。 |
|
|
リプライ・エンドポイント。指定しない場合は、デフォルトのリプライ・エンドポイント( |
|
|
フォルト・エンドポイント。 |
|
|
必要なアクション。 WS-Addressingが有効な場合、このプロパティは必須です。これは暗黙的または明示的に構成できます(「WS-Addressing Actionプロパティの関連付け」を参照)。 |
|
|
一意のメッセージID。 |
|
|
メッセージに関連付けられたメッセージID。関連メッセージが複数ある場合には、この要素を繰り返すことができます。このプロパティの属性として |
|
|
通知する必要がある参照パラメータ。 |
例2-1は、では、WS-Addressingを有効にした場合にHTTP 1.2で送信されるSOAP 1.2リクエスト・メッセージを示します。太字で示されているように、WS-Addressingは、一意のメッセージID(wsa:MessageID)、宛先(wsa:To)エンドポイント、リプライ・エンドポイント(wsa:ReplyTo)、および必要なアクション(wsa:Action)を定義するための、トランスポートに依存しないメカニズムを提供します。
例2-1 WS-Addressingを使用したSOAP 1.2メッセージ: リクエスト・メッセージ
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://www.w3.org/2005/08/addressing/">
<S:Header>
<wsa:MessageID>
http://example.com/someuniquestring
</wsa:MessageID>
<wsa:ReplyTo
<wsa:Address>http://example.com/Myclient</wsa:Address>
</wsa:ReplyTo>
<wsa:To>
http://example.com/fabrikam/Purchasing
</wsa:To>
<wsa:Action>
http://example.com/fabrikam/SubmitPO
</wsa:Action>
<S:Header>
<S:Body>
...
</S:Body>
</S:Envelope>
このメッセージへのレスポンスは、例2-2のようになります。RelatesToプロパティによってレスポンス・メッセージと元のリクエスト・メッセージが関連付けられます。
例2-2 WS-Addressingを使用しない場合のSOAP 1.2メッセージ: レスポンス・メッセージ
<S:Envelope
xmlns:S="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<S:Header>
<wsa:MessageID>http://example.com/someotheruniquestring</wsa:MessageID>
<wsa:RelatesTo>http://example.com/someuniquestring</wsa:RelatesTo>
<wsa:To>http://example.com/MyClient/wsa:To>
<wsa:Action>
http://example.com/fabrikam/SubmitPOAck
</wsa:Action>
</S:Header>
<S:Body>
...
</S:Body>
</S:Envelope>
WS-Addressingは、次のWebLogic JAX-WS拡張機能で使用されます。
非同期のクライアント・トランスポート(第4章「Webサービスの非同期呼出し」を参照)。
WS-ReliableMessaging(第6章「Webサービスの信頼性のあるメッセージングの使用」を参照)。
コールバック(第12章「コールバックの使用」を参照)。
次の項では、WebサービスまたはクライアントでWS-Addressingを有効にし、アクション・プロパティおよびフォルト・プロパティを明示的に定義する方法について説明します。
サポートされているWS-Addressing標準に関する説明
WebLogic Webサービスは、次のWeb Service Addressingの標準をサポートしています。
W3C WS-Addressing(http://www.w3.org/2002/ws/addr/を参照)
Member Submission(http://www.w3.org/Submission/ws-addressing/を参照)
この章では、W3C WS-Addressingの使用についてのみを取り上げます。
デフォルトでは、WS-AddressingはWebサービス・エンドポイントで無効化されています。そのため、受信したWS-Addressingヘッダーはすべて無視されます。WebサービスでのWS-AddressingをJavaまたはWSDLから有効にするには、次の各項に従います。
Webサービス・エンドポイントでWS-Addressingを有効にすると次のようになります。
すべてのWS-Addressingヘッダーがエンドポイントで認識されます。つまり、mustUnderstandを有効にしてWS-Addressingヘッダーを受信した場合、フォルトはスローされません。
受信したWS-Addressingヘッダーは、次のことを確認するために検証されます。
構文が正しいか
要素数が正しいか
SOAPヘッダーのwsa:Actionヘッダーが操作で必要なものと一致しているか
クライアントに返されるレスポンス・メッセージには必要なWS-Addressingヘッダーが格納されます。
WebサービスでのWS-AddressingをJavaから有効にするには、Webサービス・クラスでjava.xml.ws.soap.Addressingアノテーションを使用します。必要に応じて、表2-2に定義されているBoolean属性を1つ以上渡すことができます。
表2-2 @Addressingアノテーションの属性
| 属性 | 説明 |
|---|---|
|
|
WS-Addressingを有効にするかどうかを指定します。有効な値は、 |
|
|
インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定します。有効な値は、 |
有効にすると、wsaw:UsingAddressing要素が、対応するwsdl:binding要素内に生成されます。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。
次の例では、WS-AddressingをJavaから有効にする方法を示します。この例では、エンドポイントでWS-Addressingが実行されます(requiredをtrueに設定)。
例2-3 WebサービスでのWS-Addressingの有効化(Javaから始める場合)
package examples;
import javax.jws.WebService;
import javax.xml.ws.soap.Addressing;
@WebService(name="HelloWorld", serviceName="HelloWorldService")
@Addressing(enabled=true, required=false)
public class HelloWorld {
public String sayHelloWorld(String message) throws MissingName { ... }
}
WebサービスでのWS-AddressingをWSDLから有効にするには、wsaw:UsingAddressing要素を対応するwsdl:binding要素に追加します。必要に応じて、wsdl:required Boolean属性を追加して、インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定できます。この属性のデフォルト値はfalseです。
次の例では、WS-AddressingをWSDLから有効にする方法を示します。この例では、エンドポイントでWS-Addressingが実行されます(wsdl:requiredをtrueに設定)。
例2-4 WebサービスでのWS-Addressingの有効化(WSDLから始める場合)
...
<binding name="HelloWorldPortBinding" type="tns:HelloWorld">
<wsaw:UsingAddressing wsdl:required="true" />
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="sayHelloWorld">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="MissingName">
<soap:fault name="MissingName" use="literal"/>
</fault>
</operation>
</binding>
...
WS-Addressingは、Webサービス・クライアントで暗黙的または明示的に有効にできます。クライアントで有効にすると、次のようになります。
クライアントが受信したすべてのWS-Addressingヘッダーが認識されます。つまり、mustUnderstandを有効にしてWS-Addressingヘッダーを受信した場合、フォルトはスローされません。
JAX-WSランタイムは次のことを行います。
すべてのwsaw:Action要素(wsdl:operationのinput、outputおよびfault要素など)を、生成されたサービス・エンドポイント・インタフェース(SEI)のjavax.xml.ws.Actionおよびjavax.xml.ws.FaultActionアノテーションにマップします。
アウトバウンド・リクエストにAction、To、MessageIDおよび匿名のReplyToヘッダーを生成します。
次の項では、Webサービス・クライアントでWS-Addressingを明示的および暗黙的に有効にする方法、およびWS-Addressingを明示的に無効にする方法について説明します。
Webサービス・クライアントでは、javax.xml.ws.ServiceオブジェクトのgetPortまたはcreateDispatchメソッドにjavax.xml.ws.soap.AddressingFeatureを引数として渡すことにより、WS-Addressingを明示的に有効にできます。必要に応じて、表2-3に定義されているBooleanパラメータを1つ以上渡すことができます。
表2-3 AddressingFeature機能のパラメータ
| パラメータ | 説明 |
|---|---|
|
|
アウトバウンド・メッセージに対してWS-Addressingを有効にするかどうかを指定します。有効な値は、 |
|
|
インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定します。有効な値は、 |
次の例では、Webサービス・プロキシの作成時に、AddressingFeatureをgetPortメソッドに渡して、Webサービス・クライアントのWS-Addressingを有効にする方法を示します。
例2-5 Webサービス・プロキシのWebサービス・クライアントでのWS-Addressingの有効化
package examples.client;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import java.net.URL;
import examples.client.MissingName_Exception;
import javax.xml.ws.soap.AddressingFeature;
public class Main {
public static void main(String[] args) throws MissingName_Exception {
HelloWorldService service;
try {
service = new HelloWorldService(new URL(args[0] + "?WSDL"),
new QName("http://examples/", "HelloWorldService") );
} catch (MalformedURLException murl) { throw new RuntimeException(murl); }
HelloWorld port = service.getHelloWorldPort(
new AddressingFeature(true, true));
...
}
}
次の例では、Dispatchインスタンスの作成時に、AddressingFeatureをcreateDispatchメソッドに渡してWebサービス・クライアントのWS-Addressingを有効にする方法を示します。
wsaw:UsingAddressing拡張要素がWSDLに存在する場合、WS-Addressingは暗黙的に有効になります。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。
Webサービス・クライアントでは、独自のWS-Addressing処理モジュールを使用する場合など、WS-Addressing処理の明示的な無効化が必要となる場合があります。たとえば、MESSAGEモードのディスパッチ・クライアントを使用して非匿名のReplyToおよびFaultTo処理を実行する場合などです。
次の例では、Webサービス・プロキシの作成時に、Webサービス・クライアントのWS-Addressingを明示的に無効にする方法を示します。この例では、enabledをfalseに設定してAddressingFeature機能を呼び出します。
WS-Addressingは属性wsaw:Actionを定義します。この属性を使用して、WebサービスにWS-AddressingのActionメッセージ・アドレッシング・プロパティを明示的に関連付けることができます。デフォルトでは、WS-Addressingが有効で、Webサービスに明示的に関連付けられているアクションがない場合は、暗黙的なアクションの関連付けが行われます。
次の項では、WS-AddressingのActionプロパティを明示的または暗黙的に関連付ける方法を説明します。
WS-AddressingのActionプロパティをJavaから明示的にWebサービスに関連付けるには、javax.xml.ws.Actionおよびjavax.xml.ws.FaultActionアノテーションを使用します。
必要に応じて、表2-4に定義されている属性を@Actionアノテーションに対して1つ以上渡すことができます。
表2-4 @Actionアノテーションの属性
| 属性 | 説明 |
|---|---|
|
|
操作のinputメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。 |
|
|
操作のoutputメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。 |
|
|
操作のfaultメッセージに対応するActionメッセージ・アドレッシング・プロパティを関連付けます。表2-5に記載されているように、SOAP障害にマップされ、SOAPフォルトにマップし、明示的な関連付けが必要となる例外については、 |
表2-4に定義されている属性を@FaultActionアノテーションに対して1つ以上渡すことができます。
表2-5 @FaultActionアノテーションの属性
| 属性 | 説明 |
|---|---|
|
|
例外クラスの名前。この属性は必須です。 |
|
|
例外のWS-Addressing Actionメッセージ・アドレッシング・プロパティの値。 |
WS-AddressingのActionプロパティを明示的に関連付けると、wsaw:Action属性が、wsdl:portType要素内の対応するinput要素、output要素およびfault要素に生成されます。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。
次の例では、@Actionおよび@FaultActionアノテーションを使用して、input、output、およびfaultメッセージに対応するWS-AddressingのActionメッセージ・アドレッシング・プロパティをsayHelloWorldに明示的に関連付ける方法を示します。
例2-8 アクションの明示的な関連付けの例(Javaから始める場合)
...
@Action(
input = "http://examples/HelloWorld/sayHelloWorldRequest",
output = "http://examples/HelloWorld/sayHelloWorldResponse",
fault = { @FaultAction(className = MissingName.class,
value = "http://examples/MissingNameFault")})
public String sayHelloWorld(String message) throws MissingName {
...
定義すると、エンドポイントのwsdl:operation要素内の対応するinput要素、output要素およびfault要素にwsaw:Action要素が生成されます。これらの要素の詳細は、「WS-Addressing Actionプロパティの明示的な関連付け(WSDLから始める場合)」を参照してください。
WS-AddressingのActionプロパティをWSDLから明示的にWebサービスに関連付けるには、wwsaw:Action要素を対応するwsdl:binding要素に追加します。必要に応じて、wsdl:required Boolean属性を追加して、インバウンド・メッセージに対してWS-Addressingルールを適用するかどうかを指定できます。この属性のデフォルト値はfalseです。
次の例では、WSDLファイルで、HelloWorldエンドポイントのsayHelloWorldメソッドのinput、outputおよびfaultメッセージにWS-AddressingのActionメッセージ・アドレッシング・プロパティを明示的に関連付ける方法を示します。
例2-9 アクションの明示的な関連付けの例(WSDLから始める場合)
...
<portType name="HelloWorld">
<operation name="sayHelloWorld">
<input wsaw:Action="http://examples/HelloWorld/sayHelloWorldRequest"
message="tns:sayHelloWorld"/>
<output wsaw:Action="http://examples/HelloWorld/sayHelloWorldResponse"
message="tns:sayHelloWorldResponse"/>
<fault message="tns:MissingName" name="MissingName"
wsaw:Action="http://examples/MissingNameFault"/>
</operation>
</portType>
...
WS-Addressingが有効で、WSDLに明示的なアクションが定義されていない場合は、クライアントは次の形式を使用して暗黙的なwsa:Actionヘッダーを送信します。
inputメッセージ・アクション: targetNamespace/portTypeName/inputName
outputメッセージ・アクション: targetNamespace/portTypeName/outputName
faultメッセージ・アクション: targetNamespace/portTypeName/operationName/Fault/FaultName
targetNamespace/portTypeName/[inputName | outputName]
たとえば、次のWSDLからの抜粋のようになります。
<definitions targetNamespace="http://examples/"...>
...
<portType name="HelloWorld">
<operation name="sayHelloWorld">
<input message="tns:sayHelloWorld" name="sayHelloRequest"/>
<output message="tns:sayHelloWorldResponse" name="sayHelloResponse"/>
<fault message="tns:MissingName" name="MissingName" />
</operation>
</portType>
...
</definitions>
デフォルトのinputおよびoutputアクションは次のように定義されます。
inputメッセージ・アクション: http://examples/HelloWorld/sayHelloRequest
outputメッセージ・アクション: http://examples/HelloWorld/sayHelloResponse
faultメッセージ・アクション: http://examples/HelloWorld/sayHelloWorld/Fault/MissingName
WSDLでinputまたはoutputメッセージ名が指定されていない場合は、それぞれ操作名にRequestまたはResponseが追加された名前が使用されます。たとえば、sayHelloWorldRequestまたはsayHelloWorldResponseのようになります。
場合によって、ファイアウォールやDHCP (Dynamic Host Configuration Protocol)などのネットワーク・テクノロジが使用されている環境では、特定のエンドポイントに対してグローバルにアクセス可能なURIの使用が禁止されていることがあります。アドレッシングできないエンドポイントとのメッセージ交換を可能にするために、WS-Addressingの仕様ではwsaw:Anonymous要素を使用した「匿名」エンドポイントがサポートされています。
wsaw:Anonymous要素には表2-6に定義されているいずれかの値を設定できます。
表2-6 wsaw:Anonymous要素の有効な値
| 値 | 説明 |
|---|---|
|
|
リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URIを含めることができます。 |
|
|
リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URLを含める必要があります。そうしないと、 |
|
|
リクエスト・メッセージのレスポンス・エンドポイントEPRに匿名URIを含めないでください。そうしないと、 |
匿名WS-Addressingを構成するには:
WebサービスでWS-Addressingを有効にし、wsaw:UsingAddressing要素を対応するwsdl:binding要素に追加します。詳細は、「WebサービスでのWS-Addressingの有効化(WSDLから始める場合)」を参照してください。
|
注意: 匿名WS-Addressingが有効な場合は、 |
wsaw:Anonymous要素をwsdl:binding要素内のwsdl:operationに追加します。
次の例では、WSDLファイルで匿名WS-Addressingを有効にする方法を示します。この例では、匿名アドレッシングは必須です。
例2-10 Webサービスでの匿名WS-Addressingの有効化
...
<binding name="HelloWorldPortBinding" type="tns:HelloWorld">
<wsaw:UsingAddressing wsdl:required="true" />
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"/>
<operation name="sayHelloWorld">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
<fault name="MissingName">
<soap:fault name="MissingName" use="literal"/>
</fault>
</operation>
<wsaw:Anonymous>required</wsaw:Anonymous>
</binding>
...