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> ...