Webサービスクライアントは、WSDLから生成したスタブを利用してWebサービスを呼び出す処理を行う任意のクラスです。
WebサービスクライアントがWebサービスを呼び出す方法は、以下の二通りあります。
JAX-RPCのServiceFactoryクラスを使用してServiceオブジェクトを取得する方法
JNDIを使用してServiceオブジェクトをlookupする方法
Webサービスを呼び出す処理では、以下のオブジェクトを利用します。
ServiceFactoryクラスを使用する場合に利用します。
Serviceオブジェクトの生成を行います。
JNDIを使用する場合に利用します。
Interstageが提供するJNDIサービスプロバイダを利用し、Serviceオブジェクトを取得します。
呼び出すWebサービス全体に対応するクラスです。Serviceオブジェクトは、Serviceインタフェースをimplementsし、スタブオブジェクトの生成機能を備えています。WSDLのtargetNamespaceに基づいたパッケージ名と、WSDLのserviceのnameに基づいたクラス名でアクセスします。
呼び出すWebサービスアプリケーションに対応するクラスです。スタブオブジェクトは、サービスエンドポイントインタフェースをimplementsし、Webサービスの呼び出し機能を備えています。WSDLのtargetNamespaceに基づいたパッケージ名と、WSDLのportTypeのnameに基づいたクラス名でアクセスします。
JAX-RPCのServiceFactoryクラスを使用してServiceオブジェクトを取得する方法
ServiceFactoryクラスを使用してServiceオブジェクトを取得する方法は任意のJavaアプリケーションで利用可能です。この場合、以下の手順でWebサービスを呼び出します。
ServiceFactoryオブジェクトを生成する
ServiceFactoryオブジェクトからServiceオブジェクトを取得する
Serviceオブジェクトからスタブオブジェクトを取得する
スタブオブジェクトのメソッドを呼び出す
例
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サービスを呼び出します。
InitialContextオブジェクトを生成する
InitialContextのlookupメソッドを使用し、Serviceオブジェクトを取得する
Serviceオブジェクトからスタブオブジェクトを取得する
スタブのメソッドを呼び出す
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:”といった文字列が含まれる場合があります。