Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この章では、JAX-RPCメッセージ・ハンドラの操作の概要について説明します。
SOAPメッセージ・ハンドラは、Webサービスとやりとりするメッセージを処理するために使用できます。ハンドラには、クライアント・ハンドラとサーバー・ハンドラの2種類があります。
これらのハンドラにはSOAPエンベロープ全体へのアクセス権があるため、これらは一般的にSOAPヘッダーの処理に使用されます。ハンドラのその他の一般的な用途は、次のとおりです。
これらの機能のほとんどはOracleAS Web Servicesの管理インフラストラクチャによって用意されます。ユーザー記述のハンドラを用意する必要が生じる場合は多くありません。
WebサービスやWebサービス・クライアントに応じて、ハンドラの数はゼロにもなれば1つ以上にもなります。複数のハンドラがまとまると、ハンドラ・チェーンを形成します。ハンドラ・チェーンは、JAX-RPCランタイム実装によって管理されます。このランタイム実装のデフォルトの動作は、チェーン内の各ハンドラを順番にコールすることです。ただし、この処理モデルはjavax.xml.rpc.handler.Handler
インタフェースの実装に基づいて変更されます。たとえば、handleRequest
メッセージでfalse
が戻されると、ランタイムがチェーン内の次のハンドラの処理に進まずに停止します。例外がスローされた場合も同じ結果になります。
JAX-RPCハンドラを記述するには、javax.xml.rpc.handler.Handler
インタフェースを実装します。
package javax.xml.rpc.handler; public interface Handler{ public boolean handleRequest(javax.xml.rpc.handler.MessageContext context); public boolean handleResponse(javax.xml.rpc.handler.MessageContext context); public boolean handleFault(javax.xml.rpc.handler.MessageContext context); public void destroy(); public void init(javax.xml.rpc.handler.HandlerInfo config); public javax.xml.namespace.QName[] getHeaders(); }
Handler
インタフェースを実装するかわりに、javax.xml.rpc.handler.GenericHandler
クラスを拡張してもかまいません。このクラスにはHandlerインタフェースのすべてのメソッドのデフォルト実装が用意されているため、ユーザー記述のハンドラ実装でこれらのメソッドを再定義する必要はありません。
ハンドラは最終的には、Webサービスのデプロイメント・ディスクリプタ(webservices.xml
)に構成および登録されます。ただし、このファイルを自分で編集する必要はなく、開発時にハンドラ・クラス(Handler
インタフェースを実装するクラス)を指定することにより適切な構成をWebServicesAssemblerに生成させることができます。
注意 WebServicesAssemblerでは、JAX-RPCメッセージ・ハンドラを構成するためのAntタスクが提供されます。これらのタスクのリストについては、「ハンドラを構成して登録できるAntタスク」を参照してください。 ハンドラは、WebServicesAssemblerコマンドラインを使用して構成することはできません。 |
たとえば、例17-1のWSDLで記述されたWebサービスにサーバー・ハンドラを追加する場合は、次のAntタスクを使用できます。サーバー・ハンドラは太字になっています。
<oracle:topDownAssemble appName="hello-service" wsdl="Hello.wsdl" input="./classes" output="build" ear="dist/hello-service.ear" packageName="oracle.demo" > <oracle:porttype className="oracle.demo.HelloImpl" /> <oracle:handler name="ServerHandler" handlerClass="oracle.demo.ServerHelloHandler"/> </oracle:topDownAssemble>
この例では、hello-service
Webサービスに対して、サーバー・ハンドラoracle.demo.ServerHelloHandler
が構成されています。任意の数のハンドラを追加するには、<handler>
要素を追加して、それぞれに一意の名前を使用します。ハンドラは、ハンドラ要素をリストするのと同じ順序で、チェーンに追加されます。この例はトップダウン方式の開発のものですが、同じ<handler>
要素を使用してその他のAntタスクにハンドラを追加することもできます。
クライアント・サイド・ハンドラを追加する処理もほとんど同じです。
関連項目
|
次に、<handler>
要素を含めることができるAntタスクのリストを示します。これらのコマンドの詳細は、第18章「WebServicesAssemblerの使用方法」を参照してください。
Webサービスの生成時にAntタスクを使用してハンドラを追加する場合は、適切な構成がwebservices.xml
ファイルに自動的に追加されます。このファイルに他の情報を追加する必要はありません。
一方、コマンドラインを使用する場合、またはWebサービスのデプロイメント・ディスクリプタを手動で作成する場合は、webservices.xml
ファイルを編集する必要があります。<port-component>
要素に<handler>
サブ要素を追加することで、ファイルにハンドラを追加できます。例16-1は、複数のハンドラを含む<port-component>
要素を示しています。
<port-component> ... <handler> <handler-name>First Handler</handler-name> <handler-class>oracle.xx.AccountTransactionHandler</handler-class> <init-param> <param-name>test</param-name> <param-value>testValue</param-value> </init-param> </handler> <handler> <handler-name>Second Handler</handler-name> <handler-class>oracle.xx.NewAccountHandler</handler-class> </handler> ... </port-component>
表16-1は、サーバー・サイドのハンドラを指定する<handler>
サブ要素を示します。
webservices.xml
の内容の詳細は、次のWebアドレスにあるそのスキーマを参照してください。
http://java.sun.com/xml/ns/j2ee/j2ee_web_services_1_1.xsd
Webサービス・クライアント上で、JAX-RPCハンドラは、クライアント・アプリケーションから送信されたメッセージと、それに応答してサービスから戻されたメッセージを捕捉および処理できます。たとえば、これらのハンドラはSOAPメッセージを処理できます。次の各項では、Webサービス・クライアント上で使用するハンドラの登録方法について説明します。
J2EE Webサービス・クライアントの場合、JAX-RPCハンドラ情報は、各J2EEクライアントのデプロイメント・ディスクリプタの<service-ref>
要素内に表示されます。<service-ref>
要素は、サービスのJ2EEクライアント関連情報をすべて取得します。この情報には、WSDLおよびマッピング・ファイルの場所、サービス・インタフェース、サービスが実行されるポートおよび関連するサービス・エンドポイント・インタフェースなどがあります。
サーバー・サイドのハンドラとは異なり、クライアント・サイドのハンドラは、ポート・コンポーネント参照(<port-component>
)ではなくサービス参照(<service-ref>
)に関連付けられます。クライアント・サイドのハンドラには、起動されるサービスのポートに自身を関連付ける構成可能な<port-name>
パラメータがあります。サービス・エンドポイント(WSDLポート)の起動時には、<port-name>
の値により、実行対象のハンドラが決まります。
J2EE Webサービス・クライアントにハンドラを登録するには、クライアントのデプロイメント・ディスクリプタの<service-ref>
セクションにハンドラ情報を入力します。次のリストは、Webサービス・クライアントとして動作可能な各J2EEコンポーネントに対するJ2EEデプロイメント・ディスクリプタを示しています。
WEB-INF/web.xml
(JSPまたはサーブレット用)
META-INF/application-client.xml
(アプリケーション・クライアント用)
META-INF/ejb-jar.xml
(EJB用)
<service-ref>
要素の内容の詳細は、次のWebサイトで入手できるservice-ref
(J2EEクライアント)のスキーマを参照してください。
http://java.sun.com/xml/ns/j2ee/j2ee_web_services_client_1_1.xsd
<handler>
要素は、J2EE Webサービス・クライアント用にハンドラ情報をカプセル化します。使用可能なサブ要素の詳細は、表16-2を参照してください。
<service-ref>
セクションの最後にある任意のポート・コンポーネント情報の後ろにハンドラ情報を入力します。例16-2は、2つのハンドラが定義された<service-ref>
要素を示します。この例では、First Handler
はクラスoracle.xx.AccountTransactionHandler
に関連付けられており、portA
で動作します。Second Handler
はクラスoracle.xx.NewAccountHandler
に関連付けられており、portB
で動作します。First Handler
はPortA
が起動されているときのみ動作し、Second Handler
はPortB
が起動されているときのみ動作します。
<service-ref> <service-ref-name>service/MyHelloServiceRef</service-ref-name> .... <port-component-ref> .... </port-component-ref> <handler> <handler-name>First Handler</handler-name> <handler-class>oracle.xx.AccountTransactionHandler</handler-class> <port-name>portA</port-name> </handler> <handler> <handler-name>Second Handler </handler-name> <handler-class>oracle.xx.NewAccountHandler</handler-class> <port-name>portB</port-name> </handler> </service-ref>
J2SEクライアントのクライアント・サイドのJAX-RPCハンドラは、WebServicesAssemblerのgenProxy
Antタスクを使用して登録できます。例16-3では、J2SEクライアントはハンドラoracle.demo.ClientHelloHandler
を使用できるようになります。J2EE Webサービス・クライアントとは異なり、J2SEクライアントではデプロイメント・ディスクリプタは使用されません。
<oracle:genProxy wsdl="http://localhost:8888/hello-service/hello-service?WSDL" output="build/src/client" packageName="oracle.demo"> <oracle:handler name="ClientHelloHandler" handlerClass="oracle.demo.ClientHelloHandler" /> </oracle:genProxy>
「JAX-RPCハンドラの概要」を参照してください。
詳細は、次を参照してください。
http://java.sun.com/webservices/saaj/index.jsp
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|