BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic Web サービス プログラマーズ ガイド

 Previous Next Contents PDF で侮ヲ  

SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの作成

この章では、WebLogic Web サービスの開発中に、SOAP メッセージ ハンドラを使用して SOAP の要求メッセージおよび応答メッセージをインターセプトする方法について説明します。

 


SOAP メッセージ ハンドラおよびハンドラ チェーンの概要

SOAP メッセージ ハンドラは、Web サービスの要求と応答の両方で SOAP メッセージをインターセプトします。ハンドラは、Web サービスそのものと Web サービスを呼び出すクライアント アプリケーションの両方で作成することができます。 ハンドラをどのような場合に使用するかについては、SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの使用を参照してください。

次の表は、javax.xml.rpc.handler API の主なクラスおよびインタフェースの説明です。それらを使用してハンドラを作成する方法についてはこの章で後述します。

表10-1 JAX-RPC ハンドラのインタフェースとクラス

javax.xml.rpc.handler のクラスとインタフェース

説明

Handler

ハンドラ作成時に実装する主なインタフェース。SOAP の要求、応答、および障害を処理するメソッドが格納されている。

HandlerInfo

web-services.xml ファイルで指定されている初期化パラメータをはじめとする、ハンドラについての情報が格納されている。

MessageContext

ハンドラによって処理されたメッセージのコンテキストを抽出する。 MessageContext プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できる。

soap.SOAPMessageContext

SOAP メッセージの取得または更新に使用される MessageContext インタフェースのサブインタフェース。

javax.xml.soap.SOAPMessage

実際の SOAP の要求メッセージまたは応答メッセージが入ったオブジェクト。ヘッダー、本文、添付ファイルが含まれる。

 


SOAP メッセージ ハンドラの作成 : 主な手順

WebLogic Web サービス開発中に、SOAP の要求メッセージおよび応答メッセージをインターセプトする SOAP メッセージ ハンドラを作成するには、以下の手順に従います。

  1. ハンドラとハンドラ チェーンを設計します。 SOAP メッセージ ハンドラおよびハンドラ チェーンの設計を参照してください。

  2. ハンドラ チェーン内の各ハンドラについて、javax.xml.rpc.handler.Handler インタフェースを実装する Java クラスを作成します。 ハンドラインタフェースの実装を参照してください。

    WebLogic Server には、ハンドラ クラスのコーディングの簡素化に役立つ、JAX-RP Cハンドラ API の拡張クラスが組み込まれています。weblogic.webservice.GenericHandler という抽象クラスです。 GenericHandler Abstract クラスの拡張を参照してください。

  3. この Java コードをクラス ファイルにコンパイルします。 Ant タスクを使用した WebLogic Web サービスのアセンブルの説明にあるとおり、これらのクラス ファイルは、後で、デプロイ可能な Web サービスの EAR ファイルとしてパッケージ化します。

  4. 適切な情報で、web-services.xml デプロイメント記述子ファイルを更新します。 SOAP メッセージ ハンドラ情報による web-services.xml ファイルの更新を参照してください。

クライアント サイドの SOAP メッセージ ハンドラおよびハンドラ チェーンの作成については、クライアント アプリケーションでの SOAP メッセージ ハンドラおよびハンドラ チェーンの使用を参照してください。

 


SOAP メッセージ ハンドラおよびハンドラ チェーンの設計

SOAP メッセージ ハンドラを設計するときには、以下の事項を決める必要があります。

ハンドラ チェーン内の各ハンドラには、SOAP の要求メッセージを処理するメソッドと SOAP の応答メッセージを処理するメソッドが 1 つずつあります。これらのハンドラは、web-services.xml デプロイメント記述子ファイルで指定します。 順序付けされたハンドラのグループが、ハンドラ チェーンです。

Web サービスを呼び出すときに、WebLogic Server は次のようにハンドラを実行します。

  1. ハンドラ チェーン内のハンドラの handleRequest() メソッドはすべて、web-services.xml ファイルで指定されている順序で実行されます。これらの handleRequest() メソッドのいずれもが、SOAP の要求メッセージを変更できます。

  2. ハンドラ チェーン内の最後のハンドラの handleRequest() メソッドが実行されると、WebLogic Server は、Web サービスを実装するバックエンド コンポーネントを呼び出し、最終的な SOAP の要求メッセージを渡します。

注意: この操作は、この Web サービスに対してバックエンド コンポーネントが実際に定義されている場合にのみ発生します。ハンドラ チェーンのみで構成される Web サービスを開発することもできます。

  1. バックエンド コンポーネントの実行が終了したら、ハンドラ チェーン内のハンドラの handleResponse() メソッドが、web-services.xml ファイルで指定されているのとは逆の順序で実行されます。これらの handleResponse() メソッドのいずれもが、SOAP の応答メッセージを変更できます。

  2. ハンドラ チェーン内の最初のハンドラの handleResponse() メソッドが実行されると、WebLogic Server は、Web サービスを呼び出したクライアント アプリケーションに最終的な SOAP 応答メッセージを返します。

たとえば、次の例のように、web-services.xml デプロイメント記述子で 3 つのハンドラが指定されている、myChain というハンドラ チェーンを指定したとしましょう。

<handler-chains>
<handler-chain name="myChain">
<handler class-name="myHandlers.handlerOne" />
<handler class-name="myHandlers.handlerTwo" />
<handler class-name="myHandlers.handlerThree" />
</handler-chain>
</handler-chains>

次の図は、WebLogic Server で各ハンドラの handleRequest() メソッドと handleResponse() メソッドが実行される順序を示しています。

通常、SOAP の要求メッセージと応答メッセージの両方で同じタイプの処理が必要となるので、各 SOAP メッセージ ハンドラには、それぞれを処理する別個のメソッドがあります。たとえば、SOAP 要求にあるセキュア データを復号化する handleRequest() メソッドと、SOAP 応答を暗号化する handleResponse() メソッドを持つ暗号化ハンドラを設計する場合があります。

一方、SOAP 要求のみを処理し、それと同等の応答処理は行わないハンドラを設計することもできます。

また、ハンドラ チェーン内の次のハンドラを呼び出さず、そのまま、任意の時点でクライアント アプリケーションに応答を送信することも可能です。その方法は、以下の節で説明します。

最後に、ハンドラ チェーンにハンドラのみが存在し、バックエンド コンポーネントは 1 つも存在しない Web サービスを設計することができます。この場合、最後のハンドラにある handleRequest() メソッドが実行されると、handleResponse() メソッドが自動的に呼び出されます。 web-services.xml ファイルを使用して、バックエンド コンポーネントは指定せず、ハンドラ チェーンのみで Web サービスを実装するように指定する例については、SOAP メッセージ ハンドラ情報による web-services.xml ファイルの更新を参照してください。

 


ハンドラインタフェースの実装

SOAP メッセージ ハンドラ クラスは、次の例のように、javax.rpc.xml.handler.Handler インタフェースを実装する必要があります。 この例は、SOAP の要求および応答メッセージを出力する簡単な方法を示しています。

package examples.webservices.handler.log;
import java.util.Map;
import javax.xml.rpc.handler.Handler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.JAXRPCException;
import javax.xml.namespace.QName;
import weblogic.logging.NonCatalogLogger;
/**
* @author Copyright (c) 2002 by BEA Systems.All Rights Reserved.
*/
public final class LogHandler
implements Handler
{
private NonCatalogLogger log;
  private HandlerInfo handlerInfo;
  public void init(HandlerInfo hi) {
log = new NonCatalogLogger("WebService-LogHandler");
handlerInfo = hi;
}
  public void destroy() {}
  public QName[ ] getHeaders() { return handlerInfo.getHeaders(); }
  public boolean handleRequest(MessageContext mc) {
SOAPMessageContext messageContext = (SOAPMessageContext) mc;
    System.out.println("** Request:"+messageContext.getMessage().toString());
log.info(messageContext.getMessage().toString());
return true;
}
  public boolean handleResponse(MessageContext mc) {
    SOAPMessageContext messageContext = (SOAPMessageContext) mc;
    System.out.println("** Response:"+messageContext.getMessage().toString());
log.info(messageContext.getMessage().toString());
return true;
}
  public boolean handleFault(MessageContext mc) {
SOAPMessageContext messageContext = (SOAPMessageContext) mc;
    System.out.println("** Fault:"+messageContext.getMessage().toString());
log.info(messageContext.getMessage().toString());
}
}

javax.xml.rpc.handler.Handler インタフェースには、実装すべき次のメソッドがあります。

以降の節では、各メソッドを使用して実装をコーディングする方法を説明します。

Handler.init() メソッドを実装する

Handler.init() メソッドは、Handler オブジェクトのインスタンスを作成し、そのインスタンスが自動的に初期化されるようにするために呼び出されます。そのシグネチャは次のとおりです。

  public void init(HandlerInfo config) throws JAXRPCException {}

HandlerInfo オブジェクトには、web-services.xml ファイルで指定されている初期化パラメータをはじめとする、SOAP メッセージ ハンドラについての情報が格納されています。HandlerInfo.getHandlerConfig() メソッドを使用してパラメータを取得すると、このメソッドは、名前と値の組み合わせの入った Map オブジェクトを返します。

初期化パラメータを処理する必要がある場合、または、他の初期化タスクを実行する必要がある場合は、init() メソッドを実装します。

初期化パラメータの使用例としては、デバッグのオン、オフ、メッセージやエラーを書き込むためのログ ファイルの名前の指定などがあります。

Handler.destroy() メソッドを実装する

Handler.destroy() メソッドは、Handler オブジェクトのインスタンスを破壊するために呼び出されます。そのシグネチャは次のとおりです。

  public void destroy() throws JAXRPCException {}

destroy() メソッドを実装すると、ハンドラのライフサイクルを通じて取得されたあらゆるリソースを解放できます。

Handler.getHeaders() メソッドを実装する

Handler.getHeaders() メソッドは、このハンドラ インスタンスで処理されたヘッダー ブロックを取得します。そのシグネチャは次のとおりです。

  public QName[ ] getHeaders() {}

Handler.handleRequest() メソッドを実装する

Handler.handleRequest() メソッドは、バックエンド コンポーネントによって処理される前に SOAP の要求メッセージをインターセプトするために呼び出されます。そのシグネチャは次のとおりです。

  public boolean handleRequest(MessageContext mc) throws JAXRPCException  {}

このメソッドを実装して、バックエンド コンポーネントによって処理される前に SOAP メッセージにあるデータを復号化し、要求に含まれているパラメータの数が正しいかどうかなどの確認ができます。

MessageContext オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。 MessageContext プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。

MessageContextSOAPMessageContext サブインタフェースを使用すると、SOAP の要求メッセージの内容を取得または更新することができます。SOAP の要求メッセージそのものは、javax.xml.soap.SOAPMessage オブジェクトに格納されます。 このオブジェクトの詳細については、javax.xml.soap.SOAPMessage オブジェクトを参照してください。

SOAPMessageContext クラスは、SOAP 要求を処理する次の 2 つのメソッドを定義します。

SOAP 要求のすべての処理をコーディングしたら、次のいずれかを実行します。

Handler.handleResponse() メソッドを実装する

Handler.handleResponse() メソッドは、バックエンド コンポーネントによって処理された SOAP の応答メッセージをインターセプトするために呼び出されますが、この Web サービスを呼び出したクライアント アプリケーションに返される前に呼び出されます。そのシグネチャは次のとおりです。

  public boolean handleResponse(MessageContext mc) throws JAXRPCException  {}

このメソッドを実装すると、クライアント アプリケーションに返される前に SOAP メッセージに含まれているデータを暗号化したり、戻り値に処理を加えたりできます。

MessageContext オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。 MessageContext プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。

MessageContextSOAPMessageContext サブインタフェースを使用すると、SOAP の応答メッセージの内容を取得または更新することができます。SOAP の応答メッセージそのものは、javax.xml.soap.SOAPMessage オブジェクトに格納されます。 javax.xml.soap.SOAPMessage オブジェクトを参照してください。

SOAPMessageContext クラスは、SOAP 応答を処理する次の 2 つのメソッドを定義します。

SOAP 応答のすべての処理をコーディングしたら、次のいずれかを実行します。

Handler.handleFault() メソッドを実装する

Handler.handleFault() メソッドは、SOAP メッセージ処理モデルに基づいて SOAP 障害を処理します。そのシグネチャは次のとおりです。

    public boolean handleFault(MessageContext mc) throws JAXRPCException  {}

このメソッドを実装すると、バックエンドコンポーネントによって生成された障害のほか、handleResponse() メソッドおよび handleRequest() メソッドによって生成されたあらゆる SOAP 障害の処理も扱うことができます。

MessageContext オブジェクトは、SOAP メッセージ ハンドラによって処理されたメッセージのコンテキストを抽出します。 MessageContext プロパティにより、ハンドラ チェーン内のハンドラは処理ステートを共有できます。

MessageContextSOAPMessageContext サブインタフェースを使用すると、SOAP メッセージの内容を取得または更新することができます。SOAP メッセージそのものは、javax.xml.soap.SOAPMessage オブジェクトに格納されます。 javax.xml.soap.SOAPMessage オブジェクトを参照してください。

SOAPMessageContext クラスは、SOAP メッセージを処理する次の 2 つのメソッドを定義します。

SOAP 障害のすべての処理をコーディングしたら、次のいずれかを実行します。

javax.xml.soap.SOAPMessage オブジェクト

javax.xml.soap.SOAPMessage 抽象クラスは、JAXM (Java API for XML Messaging) 仕様の構成要素です。このクラスは、SOAP メッセージ ハンドラ作成時に SOAP の要求メッセージおよび応答メッセージを操作するのに使用します。この節では、SOAPMessage オブジェクトの基本構造と SOAP メッセージの表示および更新に役立つメソッドのいくつかについて説明します。

SOAPMessage オブジェクトは、SOAPPart オブジェクト (SOAP XML ドキュメントそのものが入っている)、または同オブジェクトと添付ファイルで構成されています。

SOAPMessage クラスの詳細な説明については、JAXM API Javadocs を参照してください。 JAXM の詳細については、http://java.sun.com/xml/jaxm/index.html を参照してください。

SOAPPart オブジェクト

SOAPPart オブジェクトには、SOAPEnvelope オブジェクトに格納された XML SOAP ドキュメントが入っています。このオブジェクトは、実際の SOAP のヘッダーと本文を取得するのに使用します。

次の Java コードのサンプルは、Handler クラスによって提供された MessageContext オブジェクトから SOAP メッセージを取り出して、その各部を参照する方法を示しています。

SOAPMessage soapMessage =  messageContext.getRequest();
SOAPPart soapPart = soapMessage.getSOAPPart();
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPBody soapBody = soapEnvelope.getBody();
SOAPHeader soapHeader = soapEnvelope.getHeader();

AttachmentPart オブジェクト

AttachmentPart オブジェクトには、SOAP メッセージに対するオプションの添付ファイルが入っています。添付ファイルは、SOAP メッセージの残りの部分とは異なり、XML フォーマットの必須部分ではないので、その形式は、単純なテキストからイメージ ファイルまで、さまざまです。

添付ファイルを操作するには、SOAPMessage クラスの以下のメソッドを使用します。

 


GenericHandler Abstract クラスの拡張

WebLogic Server には、SOAP メッセージ ハンドラ クラスの Java コードの簡素化に役立つ、JAX-RP Cハンドラ API の拡張クラスが組み込まれています。この拡張クラスは、weblogic.webservices.GenericHandler という抽象クラスです。 このクラスは、JAX-RPC javax.xml.rpc.handler.Handler インタフェースを実装します。

注意: weblogic.webservices.GenericHandler 抽象クラスは元々、JAX-RPC 仕様がまだ最終ではなく、その仕様にこの機能が含まれていなかったときに WebLogic Server 用に開発されたものです。 ただし現在は、WebLogic Server のクラスとほぼ同じ独自の GenericHandler クラスが JAX-RPC に含まれているので、WebLogic 固有のクラスではなく標準の JAX-RPC 抽象クラスを使用することを強くお勧めします。 この節の内容は、互換性のみを目的として提供されています。

JAX-RPC javax.xml.rpc.handler.GenericHandler 抽象クラスの詳細については、JAX-RPC の Javadoc を参照してください。

GenericHandler は抽象クラスなので、実装する必要があるのは、実際のコードが格納されるメソッドのみです。特に機能を持たないものも含めた、Handler インタフェースのメソッドをすべて実装する必要はありません。たとえば、ハンドラが初期化パラメータを使用せず、追加のリソースを割り当てる必要がない場合、init() メソッドは実装する必要がありません。

クラスは次のように定義されます。

package weblogic.webservice;
import javax.xml.rpc.handler.Handler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.namespace.QName;
/**
* @author Copyright (c) 2002 by BEA Systems.All Rights Reserved.
*/
public abstract class GenericHandler
implements Handler
{
  private HandlerInfo handlerInfo;
  public void init(HandlerInfo handlerInfo) {
this.handlerInfo = handlerInfo;
}
  protected HandlerInfo getHandlerInfo() { return handlerInfo; }
  public boolean handleRequest(MessageContext msg) {
return true;
}
  public boolean handleResponse(MessageContext msg) {
return true;
}
  public boolean handleFault(MessageContext msg) {}
  public void destroy() {}
public QName[ ] getHeaders() { return handlerInfo.getHeaders(); }
}

次のサンプルコードは examples.webservices.handler.nocomponent 製品サンプルからの抜粋ですが、GenericHandler 抽象クラスを使用して自分でハンドラを作成する方法を示しています。この例では、handleRequest() メソッドと handleResponse() メソッドのみを実装しています。init()destroy()getHeaders()、および handleFault() の各メソッドは実装していません (したがってコードには含まれていません)。

package examples.webservices.handler.nocomponent;
import java.util.Map;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.soap.*;
import weblogic.webservice.GenericHandler;
import weblogic.utils.Debug;
/**
* @author Copyright (c) 2002 by BEA Systems.All Rights Reserved.
*/
public final class EchoStringHandler
extends GenericHandler
{
private int me = System.identityHashCode(this);
  public boolean handleRequest(MessageContext messageContext) {
System.err.println("** handleRequest called in:"+me);
return true;
}
  public boolean handleResponse(MessageContext messageContext) {
    try {
MessageFactory messageFactory = MessageFactory.newInstance();
      SOAPMessage m = messageFactory.createMessage();
      SOAPEnvelope env = m.getSOAPPart().getEnvelope();
      SOAPBody body = env.getBody();
      SOAPElement fResponse =
body.addBodyElement(env.createName("echoResponse"));
      fResponse.addAttribute(env.createName("encodingStyle"),
"http://schemas.xmlsoap.org/soap/encoding/");
      SOAPElement result =
fResponse.addChildElement(env.createName("result"));
      result.addTextNode("Hello World");
      ((SOAPMessageContext)messageContext).setMessage(m);
      return true;
    } catch (SOAPException e) {
e.printStackTrace();
throw new JAXRPCException(e);
}
}
}

 


SOAP メッセージ ハンドラ情報による web-services.xml ファイルの更新

web-services.xml デプロイメント記述子ファイルは、Web サービス用に定義されている SOAP メッセージ ハンドラおよびハンドラ チェーンを、実行順に記述します。

ハンドラ情報で web-services.xml ファイルを更新するには、次の手順に従います。

  1. この Web サービス用に定義されたすべてのハンドラ チェーンのリストが格納される <web-services> ルート要素の <handler-chains> 子要素を作成します。

  2. <handler-chains> 要素の <handler-chain> 子要素を作成します。この要素内に、そのハンドラ チェーンにあるすべてのハンドラがリストされます。各ハンドラに対して、class-name 属性を使用してそのハンドラを実装する Java クラスの完全修飾名を指定します。<init-params> 要素を使用して、ハンドラの任意の初期化パラメータを指定します。

    次のサンプル コードからの抜粋は、3 つのハンドラ (最初のハンドラに初期化パラメータがある) の入った、myChain というハンドラ チェーンを示しています。

    <web-services>
    <handler-chains>
    <handler-chain name="myChain">
    <handler class-name="myHandlers.handlerOne" >
    <init-params>
    <init-param name="debug" value="on" />
    </init-params>
    </handler>
    <handler class-name="myHandlers.handlerTwo" />
    <handler class-name="myHandlers.handlerThree" />
    </handler-chain>
    </handler-chains>
    ...
    </web-services>

  3. <operations> 要素 (この要素自体も <web-service> 要素の子要素) の <operation> 子要素を使用して、このハンドラ チェーンが、この Web サービスのオペレーションとなるように指定します。次の 2 つのシナリオのいずれかに従います。

    • ハンドラ チェーンは、ステートレス セッション EJB などのバックエンド コンポーネントとともに実行される。

      この場合は、次の web-services.xml ファイルからの抜粋のように、<operation> 要素の componentmethodhandler-chain の各属性を使用します。

      <web-service>
      <components>
      <stateless-ejb name="myEJB">
      ...
      </stateless-ejb>
      </components>
      <operations>
      <operation name="getQuote"
      method="getQuote"
      component="myEJB"
      handler-chain="myChain" />
      </operations>
      </web-service>

      この例では、myChain ハンドラ チェーンの要求チェーンが最初に実行され、次に、myEJB ステートレスセッション EJB の getQuote() メソッドが実行され、最後に myChain の応答チェーンが実行されます。

    • ハンドラ チェーンは、バックエンド コンポーネントなしに単独で実行される。

      この場合、次の抜粋に示すように、<operation> 要素のハンドラチェーン属性のみを使用し、コンポーネントやメソッドの属性を明示的に指定することはしません。

      <web-service>
      <operations>
      <operation name="chainService"
      handler-chain="myChain" />
      </operations>
      </web-service>

      この例の Web サービスは、myChain ハンドラ チェーンのみを扱っています。

 


クライアント アプリケーションでの SOAP メッセージ ハンドラおよびハンドラ チェーンの使用

ここまで、WebLogic Server で動作する Web サービスの一環として実行される、ハンドラ チェーン内の SOAP メッセージ ハンドラを作成する方法について説明しました。一方、クライアント アプリケーション内で実行するハンドラを作成することも可能です。クライアント サイドのハンドラの場合、クライアント アプリケーションが Web サービスを呼び出す際に、以下のタイミングで 2 回実行されます。

クライアント サイド ハンドラを作成するには、サーバ サイド ハンドラの場合と同じように、javax.rpc.xml.handler.Handler インタフェースを実装する Java クラスを記述します。多くの場合は、WebLogic Server で動作するWeb サービスと Web サービスを呼び出すクライアント アプリケーションの両方で、まったく同じハンドラ クラスを使用できます。たとえば、サーバおよびクライアント双方との SOAP メッセージの送受信をログに記録する汎用のロギング ハンドラ クラスを記述できます。ハンドラ Java クラスの記述の詳細については、ハンドラインタフェースの実装を参照してください。

クライアント サイドのハンドラ クラスを作成したら、クライアント アプリケーションにハンドラを登録しますが、この手順はサーバ サイドの場合と異なります。 クライアント アプリケーションにはデプロイメント記述子がないため、javax.xml.rpc.handler.HandlerInfo クラスおよび javax.xml.rpc.handler.HandlerRegistry クラスを使用して、プログラムでハンドラを登録する必要があります。以下のクライアント アプリケーションのサンプルで登録方法の例を示します。太字で示した部分については後ほど説明します。

import java.util.ArrayList;
import java.io.IOException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.HandlerRegistry;
public class Main{
  public static void main( String[] args ){
    if( args.length == 1 ){
new Main( args[0] );
} else {
throw new IllegalArgumentException( "URL of the service not specified" );
}
}
  public Main( String wsdlUrl ){
try{
      HelloWorldService service = new HelloWorldService_Impl( wsdlUrl );
HelloWorldServicePort port = service.getHelloWorldServicePort();
      QName portName = new QName( "http://tutorial/sample4/", 
"HelloWorldServicePort");
      HandlerRegistry registry = service.getHandlerRegistry();
      List handlerList = new ArrayList();
handlerList.add( new HandlerInfo( ClientHandler.class, null, null ) );
      registry.setHandlerChain( portName, handlerList );
      System.out.println( port.helloWorld() );
}catch( IOException e ){
System.out.println( "Failed to create web service client:" + e );
}catch( ServiceException e ){
System.out.println( "Failed to create web service client:" + e );
}
}
}

上記の例で注目すべき主な点は以下のとおりです。

 

Back to Top Previous Next