ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

18.2.3 Webサービスクライアントアプリケーションを開発する

Webサービスクライアントは、WSDLから生成したスタブを利用してWebサービスを呼び出す処理を行う任意のクラスです。
WebサービスクライアントがWebサービスを呼び出す方法は、以下の二通りあります。

Webサービスを呼び出す処理では、以下のオブジェクトを利用します。

JAX-RPCで提供されるjavax.xml.rpc.ServiceFactoryオブジェクト

ServiceFactoryクラスを使用する場合に利用します。
Serviceオブジェクトの生成を行います。

javax.naming.InitialContextオブジェクト

JNDIを使用する場合に利用します。
Interstageが提供するJNDIサービスプロバイダを利用し、Serviceオブジェクトを取得します。

WSDLから生成された、ServiceインタフェースおよびServiceオブジェクト

呼び出すWebサービス全体に対応するクラスです。Serviceオブジェクトは、Serviceインタフェースをimplementsし、スタブオブジェクトの生成機能を備えています。WSDLのtargetNamespaceに基づいたパッケージ名と、WSDLのserviceのnameに基づいたクラス名でアクセスします。

WSDLから生成された、サービスエンドポイントインタフェースおよびスタブオブジェクト

呼び出すWebサービスアプリケーションに対応するクラスです。スタブオブジェクトは、サービスエンドポイントインタフェースをimplementsし、Webサービスの呼び出し機能を備えています。WSDLのtargetNamespaceに基づいたパッケージ名と、WSDLのportTypeのnameに基づいたクラス名でアクセスします。

JAX-RPCのServiceFactoryクラスを使用してServiceオブジェクトを取得する方法

ServiceFactoryクラスを使用してServiceオブジェクトを取得する方法は任意のJavaアプリケーションで利用可能です。この場合、以下の手順でWebサービスを呼び出します。

  1. ServiceFactoryオブジェクトを生成する

  2. ServiceFactoryオブジェクトからServiceオブジェクトを取得する

  3. Serviceオブジェクトからスタブオブジェクトを取得する

  4. スタブオブジェクトのメソッドを呼び出す

Serviceインタフェースのクラス名が“StockQuoteProviderService”、サービスエンドポイントインタフェースのクラス名が“StockQuoteProvider”、呼び出すWebサービスのオペレーションの名前が“getLastTradePrice”の場合についての処理例です。

ServiceFactory sf = ServiceFactory.newInstance();//(1)
StockQuoteProviderService sqs = 
(StockQuoteProviderService) sf.loadService(StockQuoteProviderService.class);//(2)
StockQuoteProvider sqp = sqs.getStockQuoteProviderPort();//(3)
float price = sqp.getLastTradePrice(tickerID);//(4)

JNDIを使用してServiceオブジェクトをlookupする場合

WebアプリケーションまたはEJBアプリケーション、J2EEアプリケーションクライアントからWebサービスを呼び出す場合、JNDIを使用してServiceオブジェクトをlookupすることができます。その他のJavaアプリケーションでServiceオブジェクトを取得する場合は、ServiceFactoryクラスを使用して取得してください。
JNDIを使用する場合は以下の手順でWebサービスを呼び出します。

  1. InitialContextオブジェクトを生成する

  2. InitialContextのlookupメソッドを使用し、Serviceオブジェクトを取得する

  3. Serviceオブジェクトからスタブオブジェクトを取得する

  4. スタブのメソッドを呼び出す

lookupの引数には、以下の文字列を指定します。

java:comp/env/[ deployment descriptorの<service-ref-name>に指定した値 ]

deployment descriptorについては、“18.6.4 service reference記述”を参照してください。

InitialContext ic = new InitialContext ();   //(1)
StockQuoteProviderService sqs =
 (StockQuoteProviderService)ic.lookup("java:comp/env/service/StockQuote");  //(2)
StockQuoteProvider sqp = sqs.getStockQuoteProviderPort();  //(3)
float price = sqp.getLastTradePrice(tickerID);  //(4)

注意

  • JAX-RPCのServiceFactoryオブジェクトでは、以下のメソッドを使用してください。

    • loadService(java.lang.Class class1)

    以下のメソッドは使用できません。

    • createService(QName serviceName)

    • createService(java.net.URL wsdlDocumentLocation, QName serviceName)

    • loadService(java.net.URL url, java.lang.Class class1,java.util.Properties properties)

    • loadService(java.net.URL url, QName qname, java.util.Properties properties)

  • Serviceオブジェクトでは、呼び出すWebサービスに対応してWSDLに基づいて生成された、対象のWebサービス固有のメソッドを使用してください。JAX-RPC APIで提供されるjavax.xml.rpc.Serviceインタフェースに定義されている汎用メソッドは使用できません。

  • セション管理を利用している場合、同じ接続先に対して新たなセションを 開始するときは、Serviceオブジェクトを新たに取得します。セション管理の利用については“18.2.5 HTTP接続に関する設定”を参照してください。

  • Serviceオブジェクトの取得では、内部的に多くの処理が行われます。アプリケーションの性能向上のため、Serviceオブジェクトをリクエストごとに取得するのではなく、取得したServiceオブジェクトを保持して再利用することを推奨します。

  • 単一のスタブオブジェクトは、複数のスレッドで同時に使用できません。スレッドの排他を行って利用する、または、リクエストごとに毎回取得するなどの対応が必要です。

  • JNDIを利用してServiceオブジェクトをlookupする場合は、単一のInitialContextオブジェクトを複数のスレッドで使用することはできません。

  • 通信異常などが発生した場合のため、これらの処理で発生する可能性のある例外については、これをすべてcatchし、すべての情報とスタックトレースをログなどに残る出力処理を行うことを推奨します。
    以下は標準出力・標準エラーがファイルに出力されている場合の例外処理の例です。

         } catch( javax.xml.rpc.ServiceException e ){
           e.printStackTrace();
           if( e.getLinkedCause() != null ){
             e.getLinkedCause().printStackTrace();
           }
         } catch( javax.xml.rpc.soap.SOAPFaultException e ){
           e.printStackTrace();
           System.out.println("  Code = " + e.getFaultCode());
           System.out.println("  String = " + e.getFaultString());
           System.out.println("  Actor = " + e.getFaultActor());
           if( e.getDetail() != null ){
             Detail detail = e.getDetail();
             Iterator it = detail.getDetailEntries();
             if( it != null ){
               while(it.hasNext()){
                 SOAPElement elm = (SOAPElement)it.next();
                 System.out.println("  Detail = " + elm);
               }
             }
           }
         } catch( javax.xml.rpc.JAXRPCException e ){
           e.printStackTrace();
           if( e.getLinkedCause() != null ){
             e.getLinkedCause().printStackTrace();
           }
         } catch( java.rmi.RemoteException e ){
           e.printStackTrace();
           if( e.detail != null ){
             e.detail.printStackTrace();
           }
         } catch( Throwable e ) {
           e.printStackTrace();
         }
  • WebサービスとのHTTP通信においてエラーが発生したり、Webサービスとの通信に至る前に発生したエラーの場合、WebサービスからのFaultの返却はありませんが、例外のメッセージに“ISWSFault”や“faultCode:”、“faultString:”といった文字列が含まれる場合があります。