ヘッダーをスキップ

Oracle Application Server Web Services開発者ガイド
10g(10.1.3.1.0)

B31868-01
目次
目次
索引
索引

戻る 次へ

16 JAX-RPCハンドラの使用方法

この章では、JAX-RPCメッセージ・ハンドラの操作の概要について説明します。

メッセージ・ハンドラの概要

SOAPメッセージ・ハンドラは、Webサービスとやりとりするメッセージを処理するために使用できます。ハンドラには、クライアント・ハンドラとサーバー・ハンドラの2種類があります。

これらのハンドラにはSOAPエンベロープ全体へのアクセス権があるため、これらは一般的にSOAPヘッダーの処理に使用されます。ハンドラのその他の一般的な用途は、次のとおりです。

これらの機能のほとんどはOracleAS Web Servicesの管理インフラストラクチャによって用意されます。ユーザー記述のハンドラを用意する必要が生じる場合は多くありません。

WebサービスやWebサービス・クライアントに応じて、ハンドラの数はゼロにもなれば1つ以上にもなります。複数のハンドラがまとまると、ハンドラ・チェーンを形成します。ハンドラ・チェーンは、JAX-RPCランタイム実装によって管理されます。このランタイム実装のデフォルトの動作は、チェーン内の各ハンドラを順番にコールすることです。ただし、この処理モデルはjavax.xml.rpc.handler.Handlerインタフェースの実装に基づいて変更されます。たとえば、handleRequestメッセージでfalseが戻されると、ランタイムがチェーン内の次のハンドラの処理に進まずに停止します。例外がスローされた場合も同じ結果になります。

関連資料

JAX-RPC 1.1仕様では、ハンドラとハンドラ・モデルについてのさらに詳しい情報が提供されています。

http://java.sun.com/webservices/jaxrpc/index.jsp 

JAX-RPCハンドラの記述方法

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サイトのAPIでは、HandlerインタフェースおよびGenericHandlerクラスについてのさらに詳しい情報が提供されています。

http://java.sun.com/j2ee/1.4/docs/api/javax/xml/rpc/handler/package-summary.html 

Antタスクでサーバー・サイド・ハンドラを構成および登録する方法

ハンドラは最終的には、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タスクにハンドラを追加することもできます。

クライアント・サイド・ハンドラを追加する処理もほとんど同じです。

関連項目

 

ハンドラを構成して登録できるAntタスク

次に、<handler>要素を含めることができるAntタスクのリストを示します。これらのコマンドの詳細は、第18章「WebServicesAssemblerの使用方法」を参照してください。

サーバー・サイド・ハンドラを登録するためのwebservices.xmlの編集方法

Webサービスの生成時にAntタスクを使用してハンドラを追加する場合は、適切な構成がwebservices.xmlファイルに自動的に追加されます。このファイルに他の情報を追加する必要はありません。

一方、コマンドラインを使用する場合、またはWebサービスのデプロイメント・ディスクリプタを手動で作成する場合は、webservices.xmlファイルを編集する必要があります。<port-component>要素に<handler>サブ要素を追加することで、ファイルにハンドラを追加できます。例16-1は、複数のハンドラを含む<port-component>要素を示しています。

例16-1    webservices.xml内のJAX-RPCハンドラのサンプル

<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>サブ要素を示します。

表16-1    サーバー・サイドのハンドラのための<handler>サブ要素 
サブ要素  説明 

<handler-class> 

ハンドラのクラスの完全修飾名。このクラスはjavax.xml.rpc.handler.Handlerを実装する必要があります。 

<handler-name> 

ハンドラを識別する一意の名前。 

<init-param> 

param-nameparam-valueのペアが1つ含まれるサブ要素。

param-nameparam-valueのペアは、ハンドラのinitメソッドに渡される単一のパラメータとその値を示します。<handler>要素内で使用可能なinit-paramサブ要素の数には制限がありません。 

webservices.xmlの内容の詳細は、次のWebアドレスにあるそのスキーマを参照してください。

http://java.sun.com/xml/ns/j2ee/j2ee_web_services_1_1.xsd

クライアント・サイドのJAX-RPCハンドラ

Webサービス・クライアント上で、JAX-RPCハンドラは、クライアント・アプリケーションから送信されたメッセージと、それに応答してサービスから戻されたメッセージを捕捉および処理できます。たとえば、これらのハンドラはSOAPメッセージを処理できます。次の各項では、Webサービス・クライアント上で使用するハンドラの登録方法について説明します。

J2EE Webサービス・クライアント用JAX-RPCハンドラの登録方法

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デプロイメント・ディスクリプタを示しています。

<service-ref>要素の内容の詳細は、次のWebサイトで入手できるservice-ref(J2EEクライアント)のスキーマを参照してください。

http://java.sun.com/xml/ns/j2ee/j2ee_web_services_client_1_1.xsd

J2EE Webサービス・クライアントでのhandler要素の使用方法

<handler>要素は、J2EE Webサービス・クライアント用にハンドラ情報をカプセル化します。使用可能なサブ要素の詳細は、表16-2を参照してください。

表16-2    J2EE Webサービス・クライアントのハンドラのための<handler>サブ要素 
サブ要素  説明 

<handler-class> 

ハンドラのクラスの完全修飾名。このクラスはjavax.xml.rpc.handler.Handlerを実装する必要があります。  

<handler-name> 

ハンドラを識別する一意の名前。 

<init-param> 

param-nameparam-valueのペアが1つ含まれるサブ要素。

param-nameparam-valueのペアは、ハンドラのinitメソッドに渡される単一のパラメータとその値を示します。<handler>要素内で使用可能なinit-paramサブ要素の数には制限がありません。 

<port-name> 

ハンドラが動作するポートの名前。 

<service-ref>セクションの最後にある任意のポート・コンポーネント情報の後ろにハンドラ情報を入力します。例16-2は、2つのハンドラが定義された<service-ref>要素を示します。この例では、First Handlerはクラスoracle.xx.AccountTransactionHandlerに関連付けられており、portAで動作します。Second Handlerはクラスoracle.xx.NewAccountHandlerに関連付けられており、portBで動作します。First HandlerPortAが起動されているときのみ動作し、Second HandlerPortBが起動されているときのみ動作します。

例16-2    J2EEクライアントのJAX-RPCハンドラのサンプル

<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 Webサービス・クライアント用JAX-RPCハンドラの登録方法

J2SEクライアントのクライアント・サイドのJAX-RPCハンドラは、WebServicesAssemblerのgenProxy Antタスクを使用して登録できます。例16-3では、J2SEクライアントはハンドラoracle.demo.ClientHelloHandlerを使用できるようになります。J2EE Webサービス・クライアントとは異なり、J2SEクライアントではデプロイメント・ディスクリプタは使用されません。

例16-3    J2SE Webサービス・クライアントのためのハンドラの登録

<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ハンドラの概要」を参照してください。

追加情報

詳細は、次を参照してください。


戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引