Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービスの高度な機能のプログラミング 11g リリース 1 (10.3.1) B55544-01 |
|
![]() 戻る |
![]() 次へ |
以下の節では、SOAP メッセージ ハンドラの作成と使用について説明します。
Web サービスの中には、SOAP メッセージへのアクセスを必要とするものがあり、SOAP メッセージに対して SOAP メッセージ ハンドラを作成できます。
SOAP メッセージ ハンドラは、Web サービスのリクエストと応答の両方で SOAP メッセージをインターセプトするメカニズムです。ハンドラは、Web サービスそのものと Web サービスを呼び出すクライアント アプリケーションの両方で作成することができます。
ハンドラ使用の簡単な例としては、SOAP メッセージのヘッダ部分の情報へのアクセスがあります。SOAP のヘッダを使用して Web サービス固有の情報を格納しておいて、ハンドラを使用してその情報を操作することができます。
SOAP メッセージ ハンドラは、Web サービスのパフォーマンスを向上させるために使用することもできます。Web サービスがデプロイされてしばらくすると、同じパラメータを使用して Web サービスを呼び出すコンシューマが多いことに気付く場合があります。よく使用される Web サービス呼び出しの結果 (静的な結果を前提として) をキャッシュしておき、Web サービスを実装するバックエンド コンポーネントを呼び出すことなく、適宜、キャッシュしておいた結果をただちに返すことによって、Web サービスのパフォーマンスを向上させることができます。このパフォーマンスの向上は、ハンドラを使用して、SOAP リクエスト メッセージに頻繁に使用されるパラメータが含まれていないかチェックすることで達成されます。
次の表では、Web サービスでハンドラ チェーンがコンフィグレーションされていることを指定するために JWS ファイル内で使用できる標準的な JWS アノテーションを示しています。その後の節で、これらのアノテーションの使い方について、より詳細に説明します。詳細については、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services MetaData for the Java Platform (JSR-181) 仕様」を参照してください。
表 9-1 SOAP メッセージ ハンドラ チェーンのコンフィグレーションに使用される JWS アノテーション
JWS アノテーション | 説明 |
---|---|
javax.jws.HandlerChain |
Web サービスを外部で定義されるハンドラ チェーンと関連付ける。複数の Web サービスで同じハンドラ コンフィグレーションを共有する必要がある場合、またはハンドラ チェーンが複数の転送のためのハンドラで構成されている場合は、このアノテーションを使用する。 |
javax.jws.soap.SOAPMessageHandlers |
各 Web サービス オペレーションの呼び出し前と呼び出し後に実行される、SOAP ハンドラのリストを指定する。外部コンフィグレーション ファイルよりも、JWS ファイル自体における組み込みのハンドラ コンフィグレーション情報が優先される場合に、(
注意 : このアノテーションは、JAX-RPC Web サービスでのみ機能する。 |
javax.jws.soap.SOAPMessageHandler |
単一の SOAP メッセージ ハンドラを |
次の表では、javax.xml.rpc.handler
API のメイン クラスおよびインタフェースについて説明します。これらの一部は、ハンドラそのものの作成時に使用します。これらの API については、後の節でより詳細に説明します。これらの API の詳細については、https://jax-rpc.dev.java.net
にある JAX-RPC 1.1 仕様を参照してください。
表 9-2 JAX-RPC ハンドラのインタフェースとクラス
javax.xml.rpc.handler のインタフェースとクラス | 説明 |
---|---|
Handler |
ハンドラ作成時に実装される主なインタフェース。SOAP のリクエスト、応答、および障害を処理するメソッドが格納されている。 |
GenericHandler |
|
HandlerChain |
ハンドラのリストを表すインタフェース。 |
HandlerRegistry |
HandlerRegistry 内のハンドラのプログラムによるコンフィグレーションに対するサポートを提供するインタフェース。 |
HandlerInfo |
ハンドラ チェーン内のハンドラの情報が格納されているクラス。 |
MessageContext |
ハンドラによって処理されたメッセージのコンテキストを抽出する。 |
soap.SOAPMessageContext |
SOAP メッセージの取得または更新に使用される MessageContext インタフェースのサブインタフェース。 |
javax.xml.soap.SOAPMessage |
実際の SOAP のリクエスト メッセージまたは応答メッセージが入ったオブジェクト。ヘッダ、本文、添付ファイルが含まれる。 |
次の手順では、Web サービスに SOAP メッセージ ハンドラを追加する高度な手順を説明します。
Web サービスを実装する基本的な JWS ファイルを作成済みであり、SOAP メッセージ ハンドラおよびハンドラ チェーンを追加することで Web サービスを更新することが前提となっています。また、Ant ベースの開発環境を設定済みであり、かつ jwsc
Ant タスクを実行するためのターゲットを含む、作業用の build.xml
ファイルがあることが前提となっています。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』を参照してください。
表 9-3 Web サービスへの SOAP メッセージ ハンドラの追加手順
# |
手順 | 説明 |
---|---|---|
1 |
ハンドラとハンドラ チェーンを設計する。 |
|
2 |
ハンドラ チェーン内の各ハンドラについて、 |
「GenericHandler クラスの作成」を参照。 |
3 |
SOAP メッセージ ハンドラをコンフィグレーションするためのアノテーションを追加して、JWS ファイルを更新する。 |
|
4 |
JWS ファイル内で |
|
5 |
ハンドラ チェーン内のすべてのハンドラ クラスをコンパイルし、Web サービスを再ビルドする。 |
「Web サービスのコンパイルと再ビルド」を参照。 |
クライアントサイドの SOAP メッセージ ハンドラおよびハンドラ チェーンの作成については、「クライアントサイド SOAP メッセージ ハンドラの作成と使用」を参照してください。
SOAP メッセージ ハンドラおよびハンドラ チェーンを設計するときには、以下の事項を決定する必要があります。
すべての作業を実行するために必要なハンドラの数
実行の順序
ハンドラ チェーン内の各ハンドラには、SOAP のリクエスト メッセージを処理するメソッドと SOAP の応答メッセージを処理するメソッドが 1 つずつあります。順序付けされたハンドラのグループが、ハンドラ チェーンです。Web サービスに、@HandlerChain
または @SOAPMessageHandler
という 2 つの JWS アノテーションのうち 1 つを備えるハンドラ チェーンが付加されていることを指定します。どちらをいつ使用するかは、後の節で説明します。
Web サービスを呼び出すときに、WebLogic Server は次のようにハンドラを実行します。
ハンドラ チェーン内のハンドラの handleRequest()
メソッドはすべて、JWS アノテーションで指定されている順序で実行されます。これらの handleRequest()
メソッドのいずれもが、SOAP のリクエスト メッセージを変更できます。
ハンドラ チェーン内の最後のハンドラの handleRequest()
メソッドが実行されると、WebLogic Server は、Web サービスを実装するバックエンド コンポーネントを呼び出し、最終的な SOAP のリクエスト メッセージを渡します。
バックエンド コンポーネントの実行が終了したら、ハンドラ チェーン内のハンドラの handleResponse()
メソッドが、JWS アノテーションで指定されているのとは逆の順序で実行されます。これらの handleResponse()
メソッドのいずれもが、SOAP の応答メッセージを変更できます。
ハンドラ チェーン内の最初のハンドラの handleResponse()
メソッドが実行されると、WebLogic Server は、Web サービスを呼び出したクライアント アプリケーションに最終的な SOAP 応答メッセージを返します。
たとえば、JWS ファイルで @HandlerChain
JWS アノテーションを使用して外部コンフィグレーション ファイルを指定することになっており、そのコンフィグレーション ファイルでは、次の例に示す 3 つのハンドラが格納された SimpleChain
というハンドラ チェーンを定義していると仮定します。
<jwshc:handler-config xmlns:jwshc="http://www.bea.com/xml/ns/jws" xmlns:soap1="http://HandlerInfo.org/Server1" xmlns:soap2="http://HandlerInfo.org/Server2" xmlns="http://java.sun.com/xml/ns/j2ee" > <jwshc:handler-chain> <jwshc:handler-chain-name>SimpleChain</jwshc:handler-chain-name> <jwshc:handler> <handler-name>handlerOne</handler-name> <handler-class>examples.webservices.soap_handlers.global_handler.ServerHandler1</handler-class> </jwshc:handler> <jwshc:handler> <handler-name>handlerTwo</handler-name> <handler-class>examples.webservices.soap_handlers.global_handler.ServerHandler2</handler-class> </jwshc:handler> <jwshc:handler> <handler-name>handlerThree</handler-name> <handler-class>examples.webservices.soap_handlers.global_handler.ServerHandler3</handler-class> </jwshc:handler> </jwshc:handler-chain> </jwshc:handler-config>
次の図は、WebLogic Server で各ハンドラの handleRequest()
メソッドと handleResponse()
メソッドが実行される順序を示しています。
通常、着信メッセージと発信メッセージで同じタイプの処理が必要となるので、各 SOAP メッセージ ハンドラには、リクエスト SOAP メッセージと応答 SOAP メッセージを処理する別個のメソッドがあります。たとえば、SOAP リクエストにあるセキュア データを復号化する handleRequest()
メソッドと、SOAP 応答を暗号化する handleResponse()
メソッドを持つ暗号化ハンドラを設計する場合があります。
一方、SOAP リクエストのみを処理し、それと同等の応答処理は行わないハンドラを設計することもできます。
また、ハンドラ チェーン内の次のハンドラを呼び出さず、そのまま、任意の時点でクライアント アプリケーションに応答を送信することも可能です。
SOAP メッセージ ハンドラ クラスでは、javax.rpc.xml.handler.GenericHandler
抽象クラスを拡張する必要があります。この抽象クラス自体が、javax.rpc.xml.handler.Handler
インタフェースを実装します。
GenericHandler
クラスは、ハンドラの記述を容易にする便利な抽象クラスです。このクラスは、ライフサイクル メソッド init()
および destroy()
ならびに Handler
インタフェースのさまざまな handleXXX()
メソッドのデフォルト実装を提供します。ハンドラ クラスを記述する際には、Handler
実装クラスの一部としてカスタマイズが必要なメソッドのみをオーバーライドします。
特に、Handler
インタフェースには、GenericHandler
を拡張するハンドラ クラス内で実装できる、次のメソッドが格納されています。
init()
「Handler.init() メソッドの実装」を参照してください。
destroy()
「Handler.destroy() メソッドの実装」を参照してください。
getHeaders()
「Handler.getHeaders() メソッドの実装」を参照してください。
handleRequest()
「Handler.handleRequest() メソッドの実装」を参照してください。
handleResponse()
「Handler.handleResponse() メソッドの実装」を参照してください。
handleFault()
「Handler.handleFault() メソッドの実装」を参照してください。
特に画像などの添付ファイルを処理する場合などには、ハンドラ内から直接 SOAP メッセージを表示または更新しなければならない場合もあります。その場合には、javax.xml.soap.SOAPMessage
抽象クラスを使用します。このクラスは、「https://saaj.dev.java.net/.」にある SOAP With Attachments API for Java 1.1 (SAAJ) 仕様の構成要素です。詳細については、「SAAJ を使用した SOAP リクエスト メッセージおよび応答メッセージの直接操作」を参照してください。
次の例は、SOAP のリクエストおよび応答メッセージを WebLogic Server のログ ファイルに出力する簡単な SOAP メッセージ ハンドラを示しています。
package examples.webservices.soap_handlers.global_handler; import javax.xml.namespace.QName; import javax.xml.rpc.handler.HandlerInfo; import javax.xml.rpc.handler.GenericHandler; import javax.xml.rpc.handler.MessageContext; import javax.xml.rpc.handler.soap.SOAPMessageContext; import javax.xml.rpc.JAXRPCException; import weblogic.logging.NonCatalogLogger; /** * このクラスは、SOAP のリクエストおよび応答メッセージにアクセスするために使用する、ハンドラ チェーンの * ハンドラを実装する * <p> * このクラスは、<code>javax.xml.rpc.handler.GenericHandler</code> * 抽象クラスを拡張するものであり、単に、メッセージが Web サービス自体を実装するバックエンド * Java クラスによって処理される前に、SOAP リクエストおよび応答メッセージを * サーバ ログ ファイルに出力する */ public class ServerHandler1 extends GenericHandler { private NonCatalogLogger log; private HandlerInfo handlerInfo; /** * ハンドラのインスタンスを初期化する。メッセージ ログの記録先となる * nonCatalogLogger を作成する */ public void init(HandlerInfo hi) { log = new NonCatalogLogger("WebService-LogHandler"); handlerInfo = hi; } /** * Web サービスを実装する Java クラスにメッセージが送信される前に、SOAP * リクエスト メッセージがログ ファイルに記録されることを指定する */ public boolean handleRequest(MessageContext context) { SOAPMessageContext messageContext = (SOAPMessageContext) context; System.out.println("** Request: "+messageContext.getMessage().toString()); log.info(messageContext.getMessage().toString()); return true; } /** * Web サービスを呼び出したクライアント アプリケーションにメッセージが送り * 返される前に、SOAP 応答メッセージがログ ファイルに記録されることを * 指定する */ public boolean handleResponse(MessageContext context) { SOAPMessageContext messageContext = (SOAPMessageContext) context; System.out.println("** Response: "+messageContext.getMessage().toString()); log.info(messageContext.getMessage().toString()); return true; } /** * SOAP エラーが Handler インスタンスによって送出された場合、メッセージが * ログ ファイルに記録されることを指定する */ public boolean handleFault(MessageContext context) { SOAPMessageContext messageContext = (SOAPMessageContext) context; System.out.println("** Fault: "+messageContext.getMessage().toString()); log.info(messageContext.getMessage().toString()); return true; } public QName[] getHeaders() { return handlerInfo.getHeaders(); } }
Handler.init()
メソッドは、Handler
オブジェクトのインスタンスを作成し、そのインスタンスが自動的に初期化されるようにするために呼び出されます。そのシグネチャは次のとおりです。
public void init(HandlerInfo config) throws JAXRPCException {}
HandlerInfo
オブジェクトには、SOAP メッセージ ハンドラ情報、特に初期化パラメータが格納されています。HandlerInfo.getHandlerConfig()
メソッドを使用してパラメータを取得すると、このメソッドは、名前と値のペアの入った java.util.Map
オブジェクトを返します。
初期化パラメータを処理する必要がある場合、または、他の初期化タスクを実行する必要がある場合は、init()
メソッドを実装します。
初期化パラメータの使用例としては、デバッグのオン、オフ、メッセージやエラーを書き込むためのログ ファイルの名前の指定などがあります。
Handler.destroy()
メソッドは、Handler
オブジェクトのインスタンスを破棄するために呼び出されます。そのシグネチャは次のとおりです。
public void destroy() throws JAXRPCException {}
destroy()
メソッドを実装すると、ハンドラのライフサイクルを通じて取得されたあらゆるリソースを解放できます。
Handler.getHeaders()
メソッドは、この Handler
インスタンスで処理できるヘッダ ブロックを取得します。そのシグネチャは次のとおりです。
public QName[] getHeaders() {}
Handler.handleRequest()
メソッドは、バックエンド コンポーネントによって処理される前に SOAP のリクエスト メッセージをインターセプトするために呼び出されます。そのシグネチャは次のとおりです。
public boolean handleRequest(MessageContext mc) throws JAXRPCException,SOAPFaultException {}
このメソッドを実装すると、バックエンド コンポーネントによって処理される前の SOAP メッセージ内のデータの復号化などのタスクが実行できます。
MessageContext
オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。MessageContext
プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。
MessageContext
の SOAPMessageContext
サブインタフェースを使用すると、SOAP のリクエスト メッセージの内容を取得または更新することができます。SOAP のリクエスト メッセージそのものは、javax.xml.soap.SOAPMessage
オブジェクトに格納されます。このオブジェクトの詳細については、「SAAJ を使用して SOAP リクエスト メッセージおよび応答メッセージの直接操作」を参照してください。
SOAPMessageContext
クラスは、SOAP リクエストを処理する次の 2 つのメソッドを定義します。
SOAPMessageContext.getMessage()
: SOAP のリクエスト メッセージの入った javax.xml.soap.SOAPMessage
オブジェクトを返します。
SOAPMessageContext.setMessage(javax.xml.soap.SOAPMessage)
: SOAP のリクエスト メッセージを変更後、それを更新します。
SOAP リクエストのすべての処理をコーディングしたら、次のシナリオのいずれかをコーディングします。
true
を返すことにより、ハンドラ リクエスト チェーン内の次のハンドラを呼び出す。
リクエスト チェーンの次のハンドラは、@HandlerChain
アノテーションによって指定されたコンフィグレーション ファイル内の <handler-chain>
要素の次の <handler>
下位要素か、@SOAPMessageHandlers
アノテーションによって指定された配列内の次の @SOAPMessageHandler
のいずれかとして指定されます。チェーン内のすべてのハンドラが実行されたら、Web サービスのコンフィグレーションによって、メソッドは、バックエンド コンポーネントの呼び出し、最終的な SOAP のリクエスト メッセージの送信、または最後のハンドラの handleResponse()
メソッドの呼び出しを行います。
false
を返すことにより、ハンドラ リクエスト チェーンの処理をブロックする。
ハンドラ リクエスト チェーンの処理をブロックすると、Web サービスのこの呼び出しについては、バックエンド コンポーネントは実行されなくなります。Web サービスの一部の呼び出しの結果をキャッシュしてあり、そのリストに現在の呼び出しも含まれている場合は、この操作が便利な場合があります。
ハンドラ リクエスト チェーンの処理は中断されますが、WebLogic Server が、現在のハンドラから順に、response チェーンを呼び出します。たとえば、ハンドラ チェーンに、handlerA と handlerB という 2 つのハンドラがあると想定します。ここで、handlerA の handleRequest()
メソッドは、handlerB の対応するメソッドの前に呼び出されるものとします。handlerA で処理がブロックされると (したがって handlerB の handleRequest()
メソッドは呼び出されない)、ハンドラ応答チェーンは handlerA で開始され、handlerB の handleRequest()
メソッドも呼び出されません。
javax.xml.rpc.soap.SOAPFaultException
を送出して、SOAP 障害を示す。
handleRequest()
メソッドが SOAPFaultException
を送出すると、WebLogic Server は、この例外を検出して、ハンドラ リクエスト チェーンの後続の処理を終了し、このハンドラの handleFault()
メソッドを呼び出します。
あらゆるハンドラ固有実行時エラーに対して JAXRPCException
を送出する。
handleRequest()
メソッドが JAXRPCException
を送出すると、WebLogic Server は、この例外を検出して、ハンドラ リクエスト チェーンの後続の処理を終了し、この例外を WebLogic Server のログ ファイルに記録し、このハンドラの handleFault()
メソッドを呼び出します。
Handler.handleResponse()
メソッドは、バックエンド コンポーネントによって処理された SOAP の応答メッセージをインターセプトするために呼び出されますが、この Web サービスを呼び出したクライアント アプリケーションに返される前に呼び出されます。そのシグネチャは次のとおりです。
public boolean handleResponse(MessageContext mc) throws JAXRPCException {}
このメソッドを実装すると、クライアント アプリケーションに返される前に SOAP メッセージに含まれているデータを暗号化したり、戻り値に処理を加えたりといったタスクを実行できます。
MessageContext
オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。MessageContext
プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。
MessageContext
の SOAPMessageContext
サブインタフェースを使用すると、SOAP の応答メッセージの内容を取得または更新することができます。SOAP の応答メッセージそのものは、javax.xml.soap.SOAPMessage
オブジェクトに格納されます。「SAAJ を使用した SOAP リクエスト メッセージおよび応答メッセージの直接操作」を参照してください。
SOAPMessageContext
クラスは、SOAP 応答を処理する次の 2 つのメソッドを定義します。
SOAPMessageContext.getMessage()
: SOAP の応答メッセージの入った javax.xml.soap.SOAPMessage
オブジェクトを返します。
SOAPMessageContext.setMessage(javax.xml.soap.SOAPMessage)
: SOAP の応答メッセージを変更後、それを更新します。
SOAP 応答のすべての処理をコーディングしたら、次のシナリオのいずれかをコーディングします。
true
を返すことにより、ハンドラ応答チェーン内の次のハンドラを呼び出す。
ハンドラ チェーンの次の応答は、@HandlerChain
アノテーションによって指定されたコンフィグレーション ファイル内の <handler-chain>
要素の前の <handler>
下位要素か、@SOAPMessageHandlers
アノテーションによって指定された配列内の前の @SOAPMessageHandler
のいずれかとして指定されます (ハンドラ チェーン上の応答は、JWS ファイルで指定されたのと逆の順序で実行されることに留意してください。詳細については、「SOAP メッセージ ハンドラおよびハンドラ チェーンの設計」を参照してください)。
ハンドラ チェーン内のすべてのハンドラが実行されたら、メソッドは、この Web サービスを呼び出したクライアント アプリケーションに最終的な SOAP の応答メッセージを返します。
false
を返すことにより、ハンドラ応答チェーンの処理をブロックする。
ハンドラ応答チェーンの処理をブロックすると、応答チェーンにある残りのハンドラが、Web サービスのこの呼び出しについては実行されなくなり、現在の SOAP メッセージがクライアント アプリケーションに返されます。
あらゆるハンドラ固有実行時エラーに対して JAXRPCException
を送出する。
handleRequest()
メソッドが JAXRPCException
を送出すると、WebLogic Server は、この例外を検出して、ハンドラ リクエスト チェーンの後続の処理を終了し、この例外を WebLogic Server のログファイルに記録し、このハンドラの handleFault()
メソッドを呼び出します。
Handler.handleFault()
メソッドは、SOAP メッセージ処理モデルに基づいて SOAP 障害を処理します。そのシグネチャは次のとおりです。
public boolean handleFault(MessageContext mc) throws JAXRPCException {}
このメソッドを実装すると、バックエンド コンポーネントによって生成された障害のほか、handleResponse()
メソッドおよび handleRequest()
メソッドによって生成されたあらゆる SOAP 障害の処理も扱うことができます。
MessageContext
オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。MessageContext
プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。
MessageContext
の SOAPMessageContext
サブインタフェースを使用すると、SOAP メッセージの内容を取得または更新することができます。SOAP メッセージそのものは、javax.xml.soap.SOAPMessage
オブジェクトに格納されます。「SAAJ を使用した SOAP リクエスト メッセージおよび応答メッセージの直接操作」を参照してください。
SOAPMessageContext
クラスは、SOAP メッセージを処理する次の 2 つのメソッドを定義します。
SOAPMessageContext.getMessage()
: SOAP メッセージの入った javax.xml.soap.SOAPMessage
オブジェクトを返します。
SOAPMessageContext.setMessage(javax.xml.soap.SOAPMessage)
: SOAP のメッセージを変更後、それを更新します。
SOAP 障害のすべての処理をコーディングしたら、次のいずれかを実行します。
true
を返すことにより、ハンドラ チェーン内の次のハンドラの handleFault()
メソッドを呼び出す。
false
を返すことにより、ハンドラ障害チェーンの処理をブロックする。
javax.xml.soap.SOAPMessage
抽象クラスは、SOAP With Attachments API for Java 1.1 (SAAJ) 仕様の構成要素です。(「https://saaj.dev.java.net/」を参照。) このクラスは、SOAP メッセージ ハンドラ作成時に SOAP のリクエスト メッセージおよび応答メッセージを操作するのに使用します。この節では、SOAPMessage
オブジェクトの基本構造と SOAP メッセージの表示および更新に役立つメソッドのいくつかについて説明します。
SOAPMessage
オブジェクトは、SOAPPart
オブジェクト (SOAP XML ドキュメントそのものが入っている)、または同オブジェクトと添付ファイルで構成されています。
SOAPMessage
クラスの詳細な説明については、SAAJ に関する Javadoc を参照してください。
SOAPPart
オブジェクトには、SOAPEnvelope
オブジェクトに格納された XML SOAP ドキュメントが入っています。このオブジェクトは、実際の SOAP のヘッダと本文を取得するのに使用します。
次の Java コードのサンプルは、Handler
クラスによって提供された MessageContext
オブジェクトから SOAP メッセージを取り出して、その各部を参照する方法を示しています。
SOAPMessage soapMessage = messageContext.getMessage(); SOAPPart soapPart = soapMessage.getSOAPPart(); SOAPEnvelope soapEnvelope = soapPart.getEnvelope(); SOAPBody soapBody = soapEnvelope.getBody(); SOAPHeader soapHeader = soapEnvelope.getHeader();
javax.xml.soap.AttachmentPart
オブジェクトには、SOAP メッセージに対するオプションの添付ファイルが入っています。添付ファイルは、SOAP メッセージの残りの部分とは異なり、XML フォーマットの必須部分ではないので、その形式は、単純なテキストからイメージ ファイルまで、さまざまです。
注意 : SOAP メッセージ ハンドラから直接に添付ファイルjava.awt.Image にアクセスする場合は、「SOAP メッセージ ハンドラで画像添付ファイルを操作する」で重要情報を参照してください。 |
添付ファイルを操作するには、SOAPMessage
クラスの以下のメソッドを使用します。
countAttachments()
: この SOAP メッセージに含まれている添付ファイルの数を返します。
getAttachments()
: すべての添付ファイルを取り出し、(AttachmentPart
オブジェクトとして) Iterator
オブジェクトに格納します。
createAttachmentPart()
: 他のタイプの Object
から AttachmentPart
オブジェクトを作成します。
addAttachmentPart()
: 作成された AttachmentPart
オブジェクトを SOAPMessage
に追加します。
この節では、添付ファイル java.awt.Image
にアクセスする SOAP メッセージ ハンドラを作成すること、および clientgen
Ant タスクによって生成されたクライアント JAX-RPC スタブを使用するクライアント アプリケーションから Image
が送信されていることを前提としています。
clientgen
Ant タスクによって生成されたクライアント コードでは、添付ファイル java.awt.Image
は image/gif
ではなく text/xml
の MIME タイプで、呼び出される WebLogic Web サービスに送信され、画像は画像を表す整数のストリームにシリアライズされます。特に、このクライアント コードは次の形式で画像をシリアライズします。
int width
int height
int[] pixels
つまり、受信した Image 添付ファイルを操作する SOAP メッセージ ハンドラでは、このデータ ストリームをデシリアライズして元の画像を作成し直す必要があるということです。
Web サービスのハンドラ チェーンをコンフィグレーションするために JWS ファイルで使用できる標準的なアノテーションは、@javax.jws.HandlerChain
および @javax.jws.soap.SOAPMessageHandlers
の 2 つです。
@javax.jws.HandlerChain
アノテーション (この章では簡単にするため @HandlerChain
とも言う) を使用する場合は、file
属性を使用して、Web サービスと関連付けるハンドラ チェーンのコンフィグレーションが含まれた外部ファイルを指定します。コンフィグレーションには、チェーン内のハンドラのリスト、ハンドラが実行される順序、初期化パラメータなどが含まれます。
以下の条件の 1 つ以上が適用される場合は、@SOAPMessageHandlers
アノテーションではなく @HandlerChain
アノテーションを JWS ファイルで使用します。
複数の Web サービスで同じコンフィグレーションを共有する場合。
ハンドラ チェーンに、複数の転送のハンドラが含まれている場合。
Web サービスを実装する JWS ファイルを再コンパイルしないで、その Web サービスのハンドラ チェーン コンフィグレーションを変更できるようにする場合。
次の JWS ファイルでは、@HandlerChain
アノテーションの使用例を示します。関連の Java コードは太字で示しています。
package examples.webservices.soap_handlers.global_handler; import java.io.Serializable; import javax.jws.HandlerChain; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.soap.SOAPBinding; import weblogic.jws.WLHttpTransport; @WebService(serviceName="HandlerChainService", name="HandlerChainPortType") // HandlerConfig.xml ファイルでコンフィグレーションされる「SimpleChain」という // 名前のハンドラ チェーンが、Web サービスのオペレーションが呼び出されるたびに // 発動することを指定する、標準的な JWS アノテーション @HandlerChain(file="HandlerConfig.xml", name="SimpleChain") @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) @WLHttpTransport(contextPath="HandlerChain", serviceUri="HandlerChain", portName="HandlerChainServicePort") /** * この JWS ファイルは、1 つのオペレーション sayHelloWorld を含む簡単な * Java クラス実装の WebLogic Web サービスの基本となる この Web サービスにはまた、 * @HandlerChain アノテーションで指定されているように、ハンドラ チェーンが * 関連付けられている */ public class HandlerChainImpl { public String sayHello(String input) { weblogic.utils.Debug.say( "in backend component. input:" +input ); return "'" + input + "' to you too!"; } }
@HandlerChain
アノテーションを使用する前に、前述の例に示すように、それを JWS ファイルにインポートする必要があります。
@HandlerChain
アノテーションの file
属性を使用し、ハンドラ チェーンのコンフィグレーション情報を含む外部ファイルの名前を指定します。この属性の値は URL です。これは相対でも絶対でもかまいません。相対 URL は、ファイルをコンパイルするために jwsc
Ant タスクを実行した時点での JWS ファイルの場所を基準とします。
Web サービスと関連付けるコンフィグレーション ファイル内のハンドラ チェーンの名前を指定するには、name
属性を使用します。この属性の値は、コンフィグレーション ファイル内の <handler-chain>
要素の name
属性に対応します。
注意 : 1 つの JWS ファイル内に複数の@HandlerChain アノテーションを指定すると、エラーになります。また、@HandlerChain アノテーションを @SOAPMessageHandlers アノテーションと一緒に使用しても、エラーになります。 |
外部コンフィグレーション ファイル作成の詳細については、「ハンドラ チェーン コンフィグレーション ファイルの作成」を参照してください。
この節で説明した標準的な JWS アノテーションの詳細については、http://www.jcp.org/en/jsr/detail?id=181
の「Web Services Metadata for the Java Platform 仕様」を参照してください。
注意 : http://www.jcp.org/en/jsr/detail?id=181 の「Web Services Metadata for the Java Platform 仕様 (JSR-181)」の説明に従って、このアノテーションは非推奨となりました。 |
@javax.jws.soap.SOAPMessageHandlers
(この節では簡単にするため @SOAPMessageHandlers
とも言う) アノテーションを使用する場合、JWS ファイル自体の中で、Web サービスのオペレーションの前と後に実行する SOAP メッセージ ハンドラの配列を指定します (@SOAPMessageHandler
アノテーションで指定)。@SOAPMessageHandler
アノテーションには、ハンドラのクラス名、初期化パラメータ、ハンドラで処理される SOAP ヘッダのリストなどを指定する属性が含まれます。JWS ファイル自体の内部でハンドラのリストを指定するので、ハンドラ チェーンのコンフィグレーションは、Web サービス内に埋め込まれます。
以下の条件の 1 つ以上が適用される場合は、@SOAPMessageHandlers
アノテーションを使用します。
外部のファイルでコンフィグレーションを指定するのではなく、Web サービス自体の内部にハンドラ チェーンのコンフィグレーションを埋め込む場合。
ハンドラ チェーンに SOAP ハンドラのみが含まれており、それ以外の転送用のハンドラは含まれていない場合。
ハンドラ チェーンのコンフィグレーションを変更するたびに JWS ファイルを再コンパイルする場合。
次の JWS ファイルでは、@SOAPMessageHandlers
アノテーションの簡単な使用例を示します。関連の Java コードは太字で示しています。
package examples.webservices.soap_handlers.simple; import java.io.Serializable; import javax.jws.soap.SOAPMessageHandlers; import javax.jws.soap.SOAPMessageHandler; import javax.jws.soap.SOAPBinding; import javax.jws.WebService; import javax.jws.WebMethod; import weblogic.jws.WLHttpTransport; @WebService(name="SimpleChainPortType", serviceName="SimpleChainService") // Web サービスのすべてのオペレーションの呼び出しの前と後に実行される // SOAP メッセージ ハンドラのリストを指定する標準的な JWS // アノテーション @SOAPMessageHandlers ( { @SOAPMessageHandler ( className="examples.webservices.soap_handlers.simple.ServerHandler1"), @SOAPMessageHandler ( className="examples.webservices.soap_handlers.simple.ServerHandler2") } ) @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) @WLHttpTransport(contextPath="SimpleChain", serviceUri="SimpleChain", portName="SimpleChainServicePort") /** * この JWS ファイルは、1 つのオペレーション sayHelloWorld を含む簡単な * Java クラス実装の WebLogic Web サービスの基本となる この Web サービスにはまた、 * @SOAPMessageHandler/s アノテーションで指定されているように、ハンドラ チェーンが * 関連付けられている */ public class SimpleChainImpl { // デフォルトでは、すべてのパブリック メソッドがオペレーションとして公開される public String sayHello(String input) { weblogic.utils.Debug.say( "in backend component. input:" +input ); return "'" + input + "' to you too!"; } }
@SOAPMessageHandlers
アノテーションおよび @SOAPMessageHandler
アノテーションを使用する前に、前述の例に示すように、それらを JWS ファイルにインポートする必要があります。これらのアノテーションは、javax.jws.soap
パッケージに入っています。
@SOAPMessageHandlers
配列で (@SOAPMessageHandler
アノテーションを使用して) ハンドラをリストした順序により、ハンドラの実行の順序 (オペレーション前なら順序どおりに、オペレーション後なら逆順で) が指定されます。前述のサンプルでは、ハンドラ チェーンにおいて 2 つのハンドラをコンフィグレーションしています。これらのハンドラのクラス名は、examples.webservices.soap_handlers.simple.ServerHandler1
と examples.webservices.soap_handlers.simple.ServerHandler2
です。
@SOAPMessageHandler
の initParams
属性を使用すると、特定のハンドラにおいて予期されている初期化パラメータの配列を指定できます。@InitParam
標準 JWS アノテーションを使用し、次の例のように、名前と値のペアを指定します。
@SOAPMessageHandler( className = "examples.webservices.soap_handlers.simple.ServerHandler1", initParams = { @InitParam(name="logCategory", value="MyService")} )
また、@SOAPMessageHandler
アノテーションには、ハンドラによって実装される SOAP ロールをリストするための roles
属性、およびハンドラによって処理される SOAP ヘッダをリストするための headers
属性も含まれています。
注意 : @SOAPMessageHandlers アノテーションを @HandlerChain アノテーションと一緒に使用すると、エラーになります。 |
この節で説明した標準的な JWS アノテーションの詳細については、http://www.jcp.org/en/jsr/detail?id=181
の「Web Services Metadata for the Java Platform 仕様」を参照してください。
JWS ファイルで @HandlerChain
アノテーションを使用して、ハンドラ チェーンを Web サービスと関連付けることにした場合は、ハンドラ チェーン内のハンドラのリスト、それらの実行順、初期化パラメータなどを指定する外部コンフィグレーション ファイルを作成する必要があります。
このファイルは、JWS ファイルの外部にあるため、この単一のコンフィグレーション ファイルを複数の Web サービスで使用するようにコンフィグレーションし、エンタープライズ内のすべての Web サービスに関してハンドラ コンフィグレーション ファイルを標準化できます。加えて、すべての Web サービスを再コンパイルすることなく、ハンドラ チェーンのコンフィグレーションを変更できます。なお、非 SOAP の転送を使用するハンドラ チェーンにハンドラを入れた場合、@SOAPMessageHandler
アノテーションではなく @HandlerChain
アノテーションを使用することが必要となります。
コンフィグレーション ファイルは、次の簡単なサンプルに示すように、XML を使用して 1 つまたは複数のハンドラ チェーンをリストします。
<jwshc:handler-config xmlns:jwshc="http://www.bea.com/xml/ns/jws" xmlns:soap1="http://HandlerInfo.org/Server1" xmlns:soap2="http://HandlerInfo.org/Server2" xmlns="http://java.sun.com/xml/ns/j2ee" > <jwshc:handler-chain> <jwshc:handler-chain-name>SimpleChain</jwshc:handler-chain-name> <jwshc:handler> <handler-name>handler1</handler-name> <handler-class>examples.webservices.soap_handlers.global_handler.ServerHandler1</handler-class> </jwshc:handler> <jwshc:handler> <handler-name>handler2</handler-name> <handler-class>examples.webservices.soap_handlers.global_handler.ServerHandler2</handler-class> </jwshc:handler> </jwshc:handler-chain> </jwshc:handler-config>
この例では、SimpleChain
というハンドラ チェーンに、handler1
および handler2
という 2 つのハンドラが入っています。これらは <handler-class>
要素で指定されるクラス名で実装されます。2 つのハンドラは、関連の Web サービス オペレーションの前には昇順で実行され、オペレーション実行後には逆順で実行されます。
ハンドラ初期化パラメータ、ハンドラによって実装される SOAP ロール、およびハンドラによって処理される SOAP ヘッダを指定するには、それぞれ <handler>
要素の <init-param>
、<soap-role>
、および <soap-header>
子要素を使用します。
外部コンフィグレーション ファイルを定義する XML スキーマ、その作成に関する詳細、およびさらなるサンプルについては、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services Metadata for the Java Platform 仕様」を参照してください。
この節では、Web サービスをコンパイルおよびビルドする作業用の build.xml
Ant ファイルがあり、ハンドラ チェーンが含まれるように、そのビルド ファイルを更新することを想定しています。この build.xml
ファイルの作成については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「WebLogic Web サービスの開発」を参照してください。
メッセージ ハンドラのコンパイルとビルドが含まれるように開発環境を更新するには、以下のガイドラインに従います。
@HandlerChain
または @SOAPMessageHandlers
アノテーションで JWS ファイルを更新後、jwsc
Ant タスクを再実行して、JWS ファイルを再コンパイルし、新しい Web サービスを生成する必要がある。これは、JWS ファイル内のアノテーションに変更を加えた場合は常に当てはまる。
JWS ファイルで @HandlerChain
アノテーションを使用し、jwsc
Ant タスクを再実行して Web サービスを再生成し、その後、外部コンフィグレーション ファイルだけを変更した場合は、2 度目の変更を有効にするために jwsc
を再実行する必要はありません。
以下の条件がすべて満たされていれば、jwsc
Ant タスクは SOAP メッセージ ハンドラ Java ファイルをハンドラ クラスにコンパイル (およびその後それらを生成されたアプリケーションにパッケージ化) する。
ハンドラ クラスは JWS ファイルの @HandlerChain
または @SOAPMessageHandler(s)
アノテーションにおいて参照される。
Java ファイルは sourcepath
属性で指定されたディレクトリ内に置かれる。
クラスは現在 CLASSPATH 内に存在しない。
ハンドラ クラスを jwsc
で自動的にコンパイルするのではなく、ユーザ側でコンパイルする場合は、jwsc
Ant タスクを実行する前に、コンパイルされたクラスが CLASSPATH 内にあることを確認してください。
ハンドラ チェーンが関連付けられている Web サービスのデプロイおよび呼び出しは、ハンドラ チェーンのない Web サービスのデプロイおよび呼び出しと同様に行う。唯一の相違点は、Web サービスのどのオペレーションを呼び出す場合でも、WebLogic Web サービスのランタイムは、オペレーション呼び出しの前と後の両方で、ハンドラ チェーン内のハンドラを実行するということです。
ここまでの各節では、WebLogic Server で動作する Web サービスの一環として実行される、サーバサイド SOAP メッセージ ハンドラを作成する方法について説明してきました。この他に、Web サービス オペレーションを呼び出すクライアント アプリケーションの一環として実行される、クライアントサイド SOAP メッセージ ハンドラを作成することもできます。クライアントサイド ハンドラの場合は、以下のタイミングで二度実行されます。
クライアント アプリケーションが Web サービスに SOAP リクエストを送信する直前
クライアント アプリケーションが Web サービスから SOAP 応答を受信した直後
クライアントサイド SOAP メッセージ ハンドラは、スタンドアロン クライアントと、WebLogic Server 内部で実行されるクライアントの、双方のためにコンフィグレーションできます。
実際の Java クライアントサイド ハンドラは、サーバサイド ハンドラと同じ方法、つまり javax.xml.rpc.handler.GenericHandler
抽象クラスを拡張する Java クラスを記述する方法で作成できます。多くの場合、WebLogic Server で実行される Web サービスとその Web サービスを呼び出すクライアント アプリケーションで、同じハンドラ クラスを使用できます。たとえば、サーバおよびクライアント用として、送信および受信したすべての SOAP メッセージをログに記録する汎用ロギング ハンドラ クラスを記述できます。
サーバサイド SOAP ハンドラのプログラミングと同様に、クライアントサイド SOAP メッセージ ハンドラを呼び出す clientgen
Ant タスクも XML ファイルを使用して指定します。ただし、次の手順で説明するように、この XML ファイルの XML スキーマは少し異なります。
次の手順では、Web サービス オペレーションを呼び出すクライアント アプリケーションにクライアントサイド SOAP メッセージ ハンドラを追加する高度な手順を説明します。
デプロイされた Web サービスを呼び出すクライアント アプリケーションを作成済みであり、クライアントサイド SOAP メッセージ ハンドラおよびハンドラ チェーンを追加することでクライアント アプリケーションを更新することを想定しています。また、Ant ベースの開発環境を設定済みであり、かつ clientgen
Ant タスクを実行するためのターゲットを含む、作業用の build.xml
ファイルがあることが前提となっています。詳細につぃては、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門』の「タンドアロン クライアントからの Web サービスの呼び出し : 主な手順」を参照してください。
クライアントサイド SOAP ハンドラと、それらのハンドラの実行順序を指定するハンドラ チェーンを設計します。この手順は、視点が Web サービスからではなくクライアント アプリケーションからとなる点を除けば、サーバサイド SOAP メッセージ ハンドラを設計するのとほぼ同じです。
「SOAP メッセージ ハンドラおよびハンドラ チェーンの設計」を参照してください。
ハンドラ チェーン内の各ハンドラについて、javax.xml.rpc.handler.GenericHandler
抽象クラスを拡張する Java クラスを作成します。この手順は、チェーン内のハンドラをサーバではなくクライアントで実行する点を除けば、サーバサイド ハンドラの場合の手順と非常に似ています。
ハンドラ クラスのプログラミングの詳細については、「GenericHandler クラスの作成」を参照してください。サンプルについては、「クライアントサイド ハンドラ クラスの例」を参照してください。
クライアントサイド SOAP ハンドラのコンフィグレーション ファイルを作成します。この XML ファイルでは、ハンドラ チェーン内のハンドラ、ハンドラが実行される順序、送信すべき初期化パラメータなどを記述します。
「クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの作成」を参照してください。
クライアント アプリケーションのビルドに使用する build.xml
ファイルを更新して、clientgen
Ant タスクに SOAP ハンドラのコンフィグレーション ファイルの名前を指定します。また、build.xml
ファイルによってハンドラ ファイルが Java クラスにコンパイルされ、クライアント アプリケーションで使用できる状態になることも確認します。
「クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの clientgen への指定」を参照してください。
適切なタスクを実行して、クライアント アプリケーションを再ビルドします。
prompt> ant build-client
次回クライアント アプリケーションを実行したときには、SOAP リクエスト メッセージの送信前と応答の受信後に、コンフィグレーション ファイルに記述した SOAP メッセージ ハンドラが自動的に実行されます。
注意 : clientgen Ant タスクにハンドラのコンフィグレーション ファイルが指定されている限り、クライアントサイド SOAP メッセージ ハンドラを呼び出すために実際のクライアント アプリケーションを更新する必要はありません。ハンドラは、生成された JAX-RPC スタブによって自動的に正しい順序で実行されます。 |
次の例では、Web サービスを呼び出すクライアント アプリケーション用にコンフィグレーションできる単純な SOAP メッセージ ハンドラ クラスを示します。
package examples.webservices.client_handler.client; import javax.xml.namespace.QName; import javax.xml.rpc.handler.HandlerInfo; import javax.xml.rpc.handler.GenericHandler; import javax.xml.rpc.handler.MessageContext; public class ClientHandler1 extends GenericHandler { private QName[] headers; public void init(HandlerInfo hi) { System.out.println("in " + this.getClass() + " init()"); } public boolean handleRequest(MessageContext context) { System.out.println("in " + this.getClass() + " handleRequest()"); return true; } public boolean handleResponse(MessageContext context) { System.out.println("in " + this.getClass() + " handleResponse()"); return true; } public boolean handleFault(MessageContext context) { System.out.println("in " + this.getClass() + " handleFault()"); return true; } public QName[] getHeaders() { return headers; } }
クライアントサイド SOAP ハンドラのコンフィグレーション ファイルでは、ハンドラ チェーン内のハンドラのリスト、ハンドラが実行される順序、初期化パラメータなどを指定します。このファイルの詳細については、「クライアントサイド ハンドラのコンフィグレーション ファイル用 XML スキーマ」を参照してください。
このコンフィグレーション ファイルでは、1 つまたは複数のハンドラを含む 1 つのハンドラ チェーンを XML で記述します。次に単純な例を示します。
<weblogic-wsee-clientHandlerChain xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee"> <handler> <j2ee:handler-name>clienthandler1</j2ee:handler-name> <j2ee:handler-class>examples.webservices.client_handler.client.ClientHandler1</j2ee:handler-class> <j2ee:init-param> <j2ee:param-name>ClientParam1</j2ee:param-name> <j2ee:param-value>value1</j2ee:param-value> </j2ee:init-param> </handler> <handler> <j2ee:handler-name>clienthandler2</j2ee:handler-name> <j2ee:handler-class>examples.webservices.client_handler.client.ClientHandler2</j2ee:handler-class> </handler> </weblogic-wsee-clientHandlerChain>
この例では、ハンドラ チェーンに 2 つのハンドラ (clienthandler1
および clienthandler2
) が含まれており、<j2ee:handler-class>
要素に指定されたクラス名で実装されています。これら 2 つのハンドラは、クライアント アプリケーションが SOAP リクエストを Web サービスに送信する直前に指定の順序で実行され、クライアント アプリケーションが Web サービスからの SOAP 応答を受信した直後に逆の順序で実行されます。
この例では、<j2ee:init-param>
要素を使用して 1 つまたは複数の初期化パラメータをハンドラに指定する方法も示しています。
ハンドラによって実装される SOAP ロール、ハンドラによって処理される SOAP ヘッダ、およびハンドラが関連付けられている WSDL のポート名要素を指定するには、それぞれ、<handler>
要素の子要素である <soap-role>
、<soap-header>
、および <port-name>
を使用します。
次の XML スキーマ ファイルでは、クライアントサイド SOAP ハンドラのコンフィグレーション ファイルの構造を定義しています。
<?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://www.bea.com/ns/weblogic/90" xmlns:wls="http://www.bea.com/ns/weblogic/90" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" > <include schemaLocation="weblogic-j2ee.xsd"/> <element name="weblogic-wsee-clientHandlerChain" type="wls:weblogic-wsee-clientHandlerChainType"> <xsd:key name="wsee-clienthandler-name-key"> <xsd:annotation> <xsd:documentation> Defines the name of the handler. The name must be unique within the chain. </xsd:documentation> </xsd:annotation> <xsd:selector xpath="j2ee:handler"/> <xsd:field xpath="j2ee:handler-name"/> </xsd:key> </element> <complexType name="weblogic-wsee-clientHandlerChainType"> <sequence> <xsd:element name="handler" type="j2ee:service-ref_handlerType" minOccurs="0" maxOccurs="unbounded"> </xsd:element> </sequence> </complexType> </schema>
1 つのコンフィグレーション ファイルで、1 つのクライアントサイド ハンドラ チェーンを指定します。コンフィグレーション ファイルのルートは <weblogic-wsee-clientHandlerChain>
で、ファイルにはゼロ個以上の <handler>
子要素が含まれます。これらの各子要素で、チェーン内の各ハンドラを記述します。
<handler>
要素の構造は、http://java.sun.com/xml/ns/j2ee/j2ee_web_services_client_1_1.xsd
の J2EE 1.4 Web Service client XML Schema で指定されている J2EE の service-ref_handlerType
複合型で記述します。
クライアントサイド SOAP ハンドラのコンフィグレーション ファイルを指定するには、clientgen
Ant タスクの handlerChainFile
属性を使用します。次に、build.xml
ファイルからの抜粋を示します。
<clientgen wsdl="http://ariel:7001/handlers/ClientHandlerService?WSDL" destDir="${clientclass-dir}" handlerChainFile="ClientHandlerChain.xml" packageName="examples.webservices.client_handler.client"/>
clientgen
によって自動的に生成された JAX-RPC スタブを使用すると、クライアント アプリケーションが Web サービス オペレーションを呼び出す前と後に、コンフィグレーション ファイルで記述されたハンドラが必ず正しい順序で実行されます。