ナビゲーションをスキップ

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

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

WebLogic Web サービスの手動アセンブル

この章では、WebLogic Web サービスの手動アセンブルに関する情報を提供します。

 


WebLogic Web サービスの手動アセンブルの概要

WebLogic Web サービスのアセンブルとは、サービスのすべてのコンポーネント (EJB JAR ファイル、SOAP メッセージ ハンドラ クラスなど) の収集、web-services.xml デプロイメント記述子ファイルの生成、および WebLogic Server にデプロイできるエンタープライズ アプリケーション EAR ファイルへのそれらすべてのパッケージ化を指します。

通常は、手順が複雑で時間がかかるので、WebLogic Web サービスは手動でアセンブルしません。そのかわりに、servicegenautotypesource2wsdd などの WebLogic Ant タスクを使用して、自動的に必要なコンポーネントをすべて生成し、デプロイ可能な EAR ファイルにパッケージ化します。

ただし、Web サービスがあまりにも複雑で Ant タスクが必須コンポーネントを生成できないか、Web サービスのアセンブリのすべての側面を完全に制御する必要がある場合は、この章の内容に基づいて Web サービスを手動でアセンブルできます。

 


WebLogic Web サービスの手動アセンブル : 主な手順

  1. Web サービスを実装するバックエンド コンポーネントを、それぞれのパッケージにパッケージ化またはコンパイルします。たとえば、ステートレス セッション EJB は EJB JAR ファイルにパッケージ化し、Java クラスはクラス ファイルにパッケージ化します。
  2. 手順の詳細については、『WebLogic Server アプリケーションの開発』を参照してください。

  3. Web サービス デプロイメント記述子ファイル (web-services.xml) を作成します。
  4. web-services.xml ファイルの詳細は、「web-services.xml ファイルについて」を参照してください。そのファイルを手動で作成する詳しい手順は、「web-services.xml ファイルの手動作成 : 主な手順」を参照してください。

  5. Web サービスで非組み込みデータ型が使用されている場合は、シリアライゼーション クラスなどの必要なコンポーネントをすべて作成します。
  6. 必要なコンポーネントの手動作成の詳細は、「非組み込みデータ型の使い方」を参照してください。

  7. すべてのコンポーネントをデプロイ可能な EAR ファイルにパッケージ化します。
  8. EAR ファイルを手動でパッケージ化するときには、必ず適切な Web サービス コンポーネントを Web アプリケーション WAR ファイルに入れてください。WAR および EAR ファイル階層の詳細については、「Web サービス EAR ファイル パッケージ」を参照してください。手順については、『WebLogic Server アプリケーションの開発』を参照してください。

 


web-services.xml ファイルについて

web-services.xml デプロイメント記述子ファイルには、Web サービスを実装するバックエンド コンポーネント、パラメータおよび戻り値として使用される非組み込みデータ型、SOAP メッセージをインターセプトする SOAP メッセージ ハンドラなど、1 つまたは複数の WebLogic Web サービスを記述する情報が入っています。他のすべてのデプロイメント記述子の場合と同様に、web-services.xml も XML ファイルです。

WebLogic Server は、web-services.xml デプロイメント記述子ファイルの内容に基づいて、デプロイされた WebLogic Web サービスの WSDL を動的に生成します。動的に生成された WSDL の URL を取得する方法の詳細については、「WebLogic Web サービスのホーム ページおよび WSDL の URL」を参照してください。

単一の WebLogic Web サービスは、1 つまたは複数のオペレーションで構成されています。各オペレーションは、異なるバックエンド コンポーネントと SOAP メッセージ ハンドラのメソッドを使用して実装することができます。たとえば、オペレーションは、ステートレス セッション EJB の単一メソッドを使用して実装されている場合、または SOAP メッセージ ハンドラとステートレス セッション EJB を組み合わせて実装されている場合があります。

1 つの web-services.xml ファイルには、少なくとも 1 つの WebLogic Web サービスの記述があります。

Web サービスを手動でアセンブルする場合は (たとえば SOAP メッセージ ハンドラおよびハンドラ チェーンを使用する場合は必須)、web-services.xml ファイルを手動で作成する必要があります。WebLogic Web サービスを、servicegen Ant タスクを使用してアセンブルする場合は、web-services.xml ファイルを手動で作成する必要はありません。Ant タスクが、EJB、Ant タスクの属性などを参照してこのファイルを作成するからです。

Web サービスを手動でアセンブルする必要がある場合も、servicegen Ant タスクを使用して基本となるテンプレートを作成してから、このマニュアルを参照して、生成された web-services.xmlservicegen では提供されていない追加の情報で更新することができます。

 


web-services.xml ファイルの手動作成 : 主な手順

web-services.xml デプロイメント記述子ファイルは、1 つまたは複数の WebLogic Web サービスを記述するものです。このファイルには、Web サービスを構成するオペレーション、オペレーションを実装するバックエンド コンポーネント、そしてオペレーションのパラメータおよび戻り値として使用される非組み込みデータ型に関するデータ型マッピングなどについての情報が入っています。さまざまな WebLogic Web サービスを記述する web-services.xml ファイルの詳細な例については、「異なるタイプの web-services.xml ファイルの調査」を参照してください。web-services.xml ファイルは任意のテキスト エディタで作成することができます。

この節で説明する各要素の詳細な説明は、「WebLogic Web サービス デプロイメント記述子の要素」を参照してください。

次の例は、単純な web-services.xml ファイルを示しています。例の後の手順は、このファイルを作成する主な手順を示しています。

<web-services>
<web-service name="stockquotes" targetNamespace="http://example.com"
uri="/myStockQuoteService">
<components>
<stateless-ejb name="simpleStockQuoteBean">
<ejb-link path="stockquoteapp.jar#StockQuoteBean" />
</stateless-ejb>
</components>
<operations>
<operation method="getLastTradePrice"
component="simpleStockQuoteBean" />
</operations>
</web-service>
</web-services>

上記の web-services.xml ファイルを手動で作成するには、次の手順に従います。

  1. 他のすべての要素を含む、<web-services> ルート要素を作成します。
  2. <web-services>
    ...
    </web-services>
  3. 作成する Web サービスに、SOAP メッセージをインターセプトする SOAP メッセージ ハンドラを含むものがある場合は、<web-services> ルート要素の <handler-chains> 子要素を作成して、ハンドラの記述に関連する子要素をすべて、呼び出し順などでハンドラ チェーンに格納します。詳細については、「SOAP メッセージ ハンドラ情報による web-services.xml ファイルの更新」を参照してください。
  4. 定義する各 Web サービスについて、次の手順を行います。
    1. <web-services> 要素の <web-service> 子要素を作成します。次の例に示すように、nametargetNamespace、および uri 属性を使用して、Web サービスの名前、ターゲット ネームスペース、クライアントが Web サービスの呼び出しに使用する URI を指定します。
    2. <web-service name="stockquote"
      targetNamespace="http://example.com"
      uri="myStockQuoteService">
      ...
      </web-service>

      Web サービスのオペレーションがすべてドキュメント指向であるように指定するには、style="document" 属性を使用します。style 属性のデフォルト値は rpc です。この場合はすべてのオペレーションが RPC 指向になります。

    3. Web サービスのオペレーションを実装するバックエンド コンポーネントをリストする <web-service> 要素の <components> 子要素を作成します。詳細については、「<components> 要素を作成する」を参照してください。
    4. Web サービスを構成するオペレーションが、パラメータまたは戻り値として非組み込みデータ型を使用する場合は、<web-service> 要素の <types> 子要素および <type-mapping> 子要素を作成して、データ型マッピング情報を追加します。詳細については、「データ型マッピング ファイルを作成する」を参照してください。
    5. 注意 :Web サービスのオペレーションがパラメータおよび戻り値として組み込みデータ型のみを使用する場合は、この手順は必要ありません。サポートされている組み込みデータ型のリストについては、「サポートされる組み込みデータ型」を参照してください。

    6. Web サービスを構成するオペレーションをリストする <web-service> 要素の <operations> 子要素を作成します。
    7. <operations xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      ....
      </operations>
    8. <operations> 要素内で、Web サービス用に定義されたオペレーションをリストします。詳細については、「<operation> 要素を作成する」を参照してください。

<components> 要素を作成する

Web サービスのオペレーションを実装するバックエンド コンポーネントをリストおよび記述する <web-service> 要素の <components> 子要素を作成します。各バックエンド コンポーネントに、後で、そのコンポーネントが実装するオペレーションを記述するのに使用する name 属性があります。

注意 :ハンドラとハンドラ チェーンがすべての作業を行ってバックエンド コンポーネントを実行しない、SOAP メッセージ ハンドラのみのタイプの Web サービスを作成する場合は、web-services.xml ファイルでの <components> 要素の指定は行いません。それ以外のすべての Web サービスについては、<components> 要素を宣言する必要があります。

リストできるバックエンド コンポーネントのタイプは次のとおりです。

<operation> 要素を作成する

<operation> 要素は、WebLogic Web サービスのパブリック オペレーションの実装方法を記述します。パブリック オペレーションとは、Web サービスの WSDL でリストされ、Web サービスを呼び出すクライアント アプリケーションによって実行されるオペレーションのことです。以下は、<operation> 宣言の例です。

<operation name="getQuote"
component="simpleStockQuoteBean"
method="getQuote">
<params>
<param name="in1" style="in" type="xsd:string" location="Header"/>
<param name="in2" style="in" type="xsd:int" location="Header"/>
<return-param name="result" type="xsd:string" location="Header"/>
</params>
</operation>

一般的には、web-services.xml ファイルにある <operation> 要素の各インスタンスには、Web サービス オペレーションのパブリック名に変換される name 属性があります。唯一の例外は、method="*" 属性を使用して EJB または Java クラスのすべてのメソッドを 1 つの <operation> 要素に指定する場合です (この場合は、オペレーションのパブリック名がメソッド名となる)。

<operation> 要素の属性を組み合わせて使用し、各種オペレーションを指定します。詳細については、「オペレーションのタイプを指定する」を参照してください。

必要であれば、<params> 要素を使用して、オペレーションのパラメータと戻り値をまとめます。詳細については、「オペレーションのパラメータおよび戻り値を指定する」を参照してください。

オペレーションのタイプを指定する

<operation> 要素の属性をさまざまな組み合わせで使用して、オペレーションのタイプ、オペレーションを実装するコンポーネントのタイプ、一方向オペレーションかどうかなどを識別します。

注意 :わかりやすくするため、次の節で取り上げる例では、パラメータの宣言はしていません。

以下の例は、さまざまなオペレーションを宣言する方法を示しています。

オペレーションのパラメータおよび戻り値を指定する

<params> 要素を使用して、オペレーションのパラメータと戻り値を明示的に宣言します。

オペレーションのパラメータや戻り値は明示的にリストする必要はありません。<operation> 要素に <params> 子要素がない場合、WebLogic Server はオペレーションを実装するバックエンド コンポーネントを参照してパラメータと戻り値を決定します。Web サービスの WSDL の生成時に、WebLogic Server は対応するメソッドのパラメータと戻り値の名前を使用します。

オペレーションのパラメータと戻り値は、以下の場合に明示的にリストしてください。

<params> 要素の <param> 子要素を使用して in パラメータを 1 つ指定し、<return-param> 子要素を指定して戻り値を指定します。in パラメータは、オペレーションを実装するメソッドを定義した順序と同じ順序で指定する必要があります。<param> 要素の数は、メソッドのパラメータ数と一致する必要があります。<return-param> 要素は、1 つのみ指定することができます。

<param> 要素と <return-param> 要素の属性を使用して、SOAP メッセージ内のパラメータの位置 (本文かヘッダ)、パラメータのタイプ (in、out、または inout) などを指定します。必ず、type 属性を使用してパラメータの XML スキーマのデータ型を指定する必要があります。次の例は、さまざまな in パラメータと戻り値を示しています。

必要に応じて、<params> 要素の <fault> 子要素を使用して、オペレーションの呼び出し中にエラーが発生した場合に送信する独自の Java 例外を指定します。この例外は、java.rmi.RemoteException 例外に加える形で送出されます。次に例を示します。

<fault name="MyServiceException"
class-name="my.exceptions.MyServiceException" />

 


異なるタイプの web-services.xml ファイルの調査

以下の節では、さまざまなタイプの WebLogic Web サービスに使用する web-services.xml ファイルの例を示します。

組み込みデータ型を使用した EJB コンポーネント Web サービス

ある種の WebLogic Web サービスは、パラメータと戻り値が組み込みデータ型であるステートレス セッション EJB を使用して実装されます。次の Java インタフェースはそのような EJB の例です。

public interface SimpleStockQuoteService extends javax.ejb.EJBObject {
public float getLastTradePrice(String ticker) throws java.rmi.RemoteException;
}

次の例は、このサンプル EJB で実装される Web サービスのものとして考えられる web-services.xml デプロイメント記述子を示しています。

<web-services>
<web-service name="stockquotes" targetNamespace="http://example.com"
uri="/myStockQuoteService">
<components>
<stateless-ejb name="simpleStockQuoteBean">
<ejb-link path="stockquoteapp.jar#StockQuoteBean" />
</stateless-ejb>
</components>
<operations>
<operation method="getLastTradePrice"
component="simpleStockQuoteBean" />
</operations>
</web-service>
</web-services>

例では、stockquotes という Web サービスが使用されています。その Web サービスは、ejb-jar.xml ファイルにある <ejb-name>StockQuoteBean で、stockquoteapp.jar という EJB JAR ファイルにパッケージ化されているステートレス セッション EJB を使用して実装されています。このコンポーネントの内部名は simpleStockQuoteBean です。この Web サービスにはオペレーションが 1 つあり、その名前は EJB メソッド名と同じく、getLastTradePrice です。in パラメータと out パラメータは、メソッド シグネチャから推測されるので、web-services.xml ファイルで明示的に指定する必要はありません。

注意 :servicegen Ant タスクは、web-services.xml ファイルにあるオペレーションのリストを生成する際、EJBObject のメソッドは取り込みません。

先の例では、Web サービスのオペレーションを明示的にリストする方法を示しています。次の例に示すように、<operation method="*"> 要素を 1 つのみ取り込むことで、EJB のすべてのパブリック メソッドを暗黙的にエクスポーズすることも可能です。

<operations>
<operation method="*"
component="simpleStockQuoteBean" />
</operations>

Web サービスが HTTPS のみをサポートする場合は、次の例で示すとおり、<web-service> 要素の protocol 属性を使用します。

<web-service name="stockquotes"
targetNamespace="http://example.com"
uri="/myStockQuoteService"
protocol="https" >
...
</web-service>

非組み込みデータ型を使用した EJB コンポーネント Web サービス

比較的複雑な Web サービスとして、オペレーションがパラメータおよび戻り値として非組み込みデータ型を受け取るタイプがあります。これらの非組み込みデータ型は、直接 XML または SOAP のデータ型にはマップしないので、web-services.xml ファイルでデータ型を記述する必要があります。

たとえば、次のインタフェースは、2 つのメソッドが TradeResult オブジェクトを返す EJB を記述しています。

public interface Trader extends EJBObject {
public TradeResult buy (String stockSymbol, int shares)
throws RemoteException;
public TradeResult sell (String stockSymbol, int shares)
throws RemoteException;
}

TradeResult クラスは次のようになります。

public class TradeResult implements Serializable {
  private int    numberTraded;
private String stockSymbol;
  public TradeResult() {}
  public TradeResult(int nt, String ss) {
numberTraded = nt;
stockSymbol = ss;
}
  public int getNumberTraded() { return numberTraded; }
public void setNumberTraded(int numberTraded) {
this.numberTraded = numberTraded; }
  public String getStockSymbol() { return stockSymbol; }
public void setStockSymbol(String stockSymbol) {
this.stockSymbol = stockSymbol; }
}

次の web-services.xml ファイルは、EJB を使用して実装された Web サービスを記述しています。

<web-services>
  <web-service name="TraderService" 
uri="/TraderService"
targetNamespace="http://www.bea.com/examples/Trader">
    <types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:stns="java:examples.webservices"
attributeFormDefault="qualified"
elementFormDefault="qualified"
targetNamespace="java:examples.webservices">
<xsd:complexType name="TradeResult">
<xsd:sequence><xsd:element maxOccurs="1" name="stockSymbol"
type="xsd:string" minOccurs="1">
</xsd:element>
<xsd:element maxOccurs="1" name="numberTraded"
type="xsd:int" minOccurs="1">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</types>
    <type-mapping>
<type-mapping-entry
deserializer="examples.webservices.TradeResultCodec"
serializer="examples.webservices.TradeResultCodec"
class-name="examples.webservices.TradeResult"
xmlns:p1="java:examples.webservices"
type="p1:TradeResult" >
</type-mapping-entry>
</type-mapping>
    <components>
<stateless-ejb name="ejbcomp">
<ejb-link path="trader.jar#TraderService" />
</stateless-ejb>
</components>
    <operations>
<operation method="*" component="ejbcomp">
</operation>
</operations>
  </web-service>
</web-services>

この例では、<types> 要素は、XML スキーマ表記法を使用して TradeResult データ型の XML 表現を記述しています。<type-mapping> 要素には、<types> 要素で記述されている各データ型に対するエントリが入っています (この場合は TradeResult が 1 つのみ)。<type-mapping-entry> は、Java オブジェクトを作成する Java クラス ファイルのほか、XML と Java 間でデータを変換するシリアライゼーション クラスをリストします。

EJB コンポーネントおよび SOAP メッセージ ハンドラ チェーンを使用する Web サービス

また、SOAP のリクエスト メッセージおよび応答メッセージをインターセプトする、ステートレス セッション EJB バックエンド コンポーネントと SOAP メッセージ ハンドラ チェーンの両方を使用して実装されるタイプの Web サービスもあります。次の web-services.xml ファイルのサンプルでは、そのような Web サービスが記述されています。

<web-services>
<handler-chains>
<handler-chain name="submitOrderCrypto">
<handler class-name="com.example.security.EncryptDecrypt">
<init-params>
<init-param name="elementToDecrypt" value="credit-info" />
<init-param name="elementToEncrypt" value="order-number" />
</init-params>
</handler>
</handler-chain>
</handler-chains>
    <web-service targetNamespace="http://example.com" name="myorderproc"
uri="myOrderProcessingService">
<components>
<stateless-ejb name="orderbean">
<ejb-link path="myEJB.jar#OrderBean" />
</stateless-ejb>
</components>
<operations xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<operation name="submitOrder" method="submit"
component="orderbean"
handler-chain="submitOrderCrypto" >
<params>
<param name="purchase-order" style="in" type="xsd:anyType" />
<return-param name="order-number" type="xsd:string" />
</params>
</operation>
</operations>
</web-service>
</web-services>

この例では、SOAP のリクエスト メッセージおよび応答メッセージにある情報の暗号化および復号化に使用される、submitOrderCrypto という SOAP メッセージ ハンドラ チェーンの入った Web サービスを示しています。このハンドラ チェーンには、com.example.security.EncryptDecrypt Java クラスを使用して実装されたハンドラが 1 つ組み込まれています。ハンドラは、SOAP メッセージにある暗号化および復号化が必要な要素を指定する初期化パラメータを 2 つ受け取ります。

Web サービスは orderbean というステートレス セッション EJB バックエンド コンポーネントを 1 つ定義します。

submitOrder オペレーションは、methodcomponent、および handler-chain の各属性を組み合わせて指定することによってハンドラ チェーンとバックエンド コンポーネントを結合する方法を示しています。クライアント アプリケーションが submitOrder オペレーションを呼び出すと、submitOrderCrypto ハンドラ チェーンはまず、SOAP リクエストを処理してクレジット カード情報を復号化します。次に、ハンドラ チェーンは orderbean EJB の submit() メソッドを呼び出し、SOAP メッセージから受け取ったパラメータを、purchase-order 入力パラメータも含めて変更を加えてから渡します。次に、submit() メソッドは、order-number を返します。返された値はハンドラ チェーンによって暗号化され、最終的に、暗号化された情報の入った SOAP 応答が、最初に submitOrder オペレーションを呼び出したクライアント アプリケーションに送信されます。

SOAP メッセージ ハンドラ チェーンの Web サービス

WebLogic Web サービスを、SOAP メッセージ ハンドラ チェーンのみを使用して実装し、バックエンド コンポーネントをまったく呼び出さない場合もあります。このタイプの Web サービスは、たとえば、既存のワークフロー処理システムに対するフロントエンドとして便利な場合があります。ハンドラ チェーンは、単に、SOAP リクエスト メッセージを受け取って、それをワークフロー システムに渡すだけで、ワークフロー システムがその後の処理をすべて実行します。

次の web-services.xml ファイルのサンプルでは、そのような Web サービスが記述されています。

<web-services>
<handler-chains>
<handler-chain name="enterWorkflowChain">
<handler class-name="com.example.WorkFlowEntry">
<init-params>
<init-param name="workflow-eng-jndi-name"
value="workflow.entry" />
</init-params>
</handler>
</handler-chain>
</handler-chains>
    <web-service targetNamespace="http://example.com" 
name="myworkflow" uri="myWorkflowService">
<operations xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<operation name="enterWorkflow"
handler-chain="enterWorkflowChain"
invocation-style="one-way" />
</operations>
</web-service>
</web-services>

この例では、enterWorkflowChain という SOAP メッセージ ハンドラ チェーンが 1 つ入った Web サービスを示しています。このハンドラ チェーンにはハンドラ (com.example.WorkFlowEntry Java クラスを使用して実装されたもの) が 1 つあり、初期化パラメータとして、既存ワークフロー システムの JNDI 名を受け取ります。

Web サービスは、enterWorkflow というオペレーションを 1 つ定義します。クライアント アプリケーションがこのオペレーションを呼び出すと、enterWorkflowChain ハンドラ チェーンは、SOAP のリクエスト メッセージを受け取って、WebLogic Server で稼動する、workflow.entry という JNDI 名を持つワークフロー システムに渡します。このオペレーションは、非同期一方向方式オペレーションとして定義されます。つまり、クライアント アプリケーションは SOAP 応答を受け取りません。

enterWorkflow オペレーションは、method 属性および component 属性を指定しないので、バックエンド コンポーネントが Web サービスから直接呼び出されることはありません。したがって、web-services.xml ファイルで <components> 要素を指定する必要もありません。

 

ページの先頭 前 次