カスタム EJB コンポーネントの作成: オプション 1

推奨されるマイグレーション手法は、 SCA コンポーネントとしてステートレス・セッション EJB を呼び出すことができるようにする、 ステートレス・セッション・バインディング・タイプの WebSphere® Integration Developer Import を使用することです。 マイグレーション時に、SCA Java™ インターフェースのスタイルと既存の EJB インターフェースのスタイルの間で変換されるように、 カスタムの Java コードが作成されている必要があります。

カスタム EJB コンポーネントを作成するには、以下を行います。
  1. モジュール・プロジェクトの下で、「インターフェース」を展開して、WebSphere Studio Application Developer Integration 内でこの EJB 用に生成された WSDL インターフェースを選択します。
  2. このインターフェースをアセンブリー・エディターにドラッグ・アンド・ドロップします。 作成するコンポーネントのタイプを選択するように求めるダイアログがポップアップ表示されます。 「実装タイプのないコンポーネント」を選択して、 「OK」をクリックします。
  3. アセンブリー図に、汎用コンポーネントが表示されます。 そのコンポーネントを選択して、「プロパティー」ビューに進みます。
  4. 「記述」タブで、 コンポーネントの名前を変更して、より分かりやすい名前で表示することができます。 EJB の名前に類似した名前を選択してください。 ただし、このコンポーネントは WebSphere Studio Application Developer Integration の EJB 用に生成された WSDL インターフェースと、 その EJB の Java インターフェースとの間を仲介する Java コンポーネントになるため、 その名前に「JavaMed」などの接尾部を付加します。
  5. 「詳細」タブで、 このコンポーネントに 1 つのインターフェース (アセンブリー・エディターにドラッグ・アンド・ドロップしたインターフェース) があることが分かります。
  6. アセンブリー・エディターに戻り、作成したばかりのコンポーネントを右クリックして、 「実装の生成...」 > 「Java」を選択します。 Java の実装が生成されるパッケージを選択します。 これにより、SCA プログラミング・モデル (複合タイプは commonj.sdo.DataObject であるオブジェクトによって表され、 単純タイプはそれと同等の Java オブジェクトによって表される) に準拠した WSDL インターフェースに従ったスケルトン Java サービスが作成されます。
下記のコードの例は、以下を示しています。
  1. 5.1 の WSDL インターフェースからの関連する定義
  2. WSDL に対応する WebSphere Studio Application Developer Integration Edition 5.1 Java メソッド
  3. 同じ WSDL 用の WebSphere Integration Developer 6.0 Java メソッド
以下のコードは、5.1 の WSDL インターフェースからの関連する定義を示しています。
<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="qualified"
elementFormDefault="unqualified"
targetNamespace="http://migr.practice.ibm.com/"
xmlns:xsd1="http://migr.practice.ibm.com/">
<complexType name="StockInfo">
<all>
<element name="index" type="int"/>
<element name="price" type="double"/>
<element name="symbol" nillable="true"
type="string"/>
</all>
</complexType>
</schema>
</types>
<message name="getStockInfoRequest">
<part name="symbol" type="xsd:string"/>
</message>
<message name="getStockInfoResponse">
<part name="result" type="xsd1:StockInfo"/>
</message>
<operation name="getStockInfo" parameterOrder="symbol">
<input message="tns:getStockInfoRequest"
name="getStockInfoRequest"/>
<output message="tns:getStockInfoResponse"
name="getStockInfoResponse"/>
</operation>
以下のコードは、WSDL に対応する WebSphere Studio Application Developer Integration Edition 5.1 Java メソッドを示しています。
public StockInfo getStockInfo(String symbol)
{
return new StockInfo();
}
public void setStockPrice(String symbol, float newPrice)
{
		// set some things
}
以下のコードは、同じ WSDL 用の WebSphere Integration Developer 6.0 Java メソッドを示しています。
public DataObject getStockInfo(String aString) {
//TODO Needs to be implemented.
return null;
}
public void setStockPrice(String symbol, Float newPrice) {
//TODO Needs to be implemented.
}
生成された Java 実装クラスの中の「//TODO」タグで示されている部分には、 最終的に実際のコードを入力する必要があります。 まず最初に、この Java コンポーネントから実際の EJB への参照を作成して、 これが SCA プログラミング・モデルに従って EJB にアクセスできるようにする必要があります。
  1. アセンブリー・エディターを開いたままにして、J2EE パースペクティブに切り替えます。 サービスの作成対象の EJB が含まれている EJB プロジェクトを見つけます。
  2. その「デプロイメント記述子: <project-name> (Deployment Descriptor: <project-name>)」項目を展開して、 EJB を見つけます。 これをアセンブリー・エディターにドラッグ・アンド・ドロップします。 更新を必要としているプロジェクト依存関係に関する警告が出された場合は、 「モジュール依存関係エディターを開き、... (Open the module dependency editor…)」チェック・ボックスを選択して、 「OK」をクリックします。
  3. J2EE セクションで、その EJB プロジェクトがリストされていることを確認し、 リストされていなければ、「追加...」ボタンをクリックして追加します。
  4. モジュール依存関係を保管し、そのエディターを閉じます。 新しいインポートがアセンブリー・エディターに作成されていることが分かります。 そのインポートを選択し、「記述」タブの「プロパティー」ビューに進み、 そのインポートの名前を変更して、より分かりやすい名前で表示できます。 「バインディング」タブでは、インポート・タイプが自動的に「ステートレス・セッション Bean バインディング」に設定され、 すでに EJB の JNDI 名が適切に設定されていることが分かります。
  5. アセンブリー・エディターのパレットから、ワイヤー・ツールを選択します。
  6. Java コンポーネントをクリックして、マウスを放します。
  7. 次に、「EJB インポート」をクリックして、マウスを放します。
  8. 「ソース・ノード上にマッチング参照が作成されます。継続しますか?」が表示されたら、 「OK」をクリックします。 これにより、2 つのコンポーネント間にワイヤーが作成されます。
  9. アセンブリー・エディター内および「詳細」タブの「プロパティー」ビューで Java コンポーネントを選択し、「参照」を展開して、作成したばかりの EJB への参照を選択します。 生成された名前があまり分かりやすくないか、適切でない場合は、 参照の名前を更新できます。 この参照の名前は、将来の利用のために覚えておいてください。
  10. アセンブリー図を保管します。
生成された Java クラスから EJB を呼び出すためには、 SCA プログラミング・モデルを使用する必要があります。 生成された Java クラスを開き、以下のステップに従って、EJB サービスを呼び出すコードを作成します。 生成された Java 実装クラスについて、以下のようにします。
  1. 次の private 変数 (タイプがリモート EJB インターフェースのもの) を作成します。
    private YourEJBInterface ejbService = null;
  2. EJB インターフェースに複合タイプがある場合は、BOFactory 用の private 変数も作成します。
    private BOFactory boFactory = (BOFactory) 
    ServiceManager.INSTANCE.locateService(“com/ibm/websphere/bo
    /BOFactory”);
  3. Java 実装クラスのコンストラクターで、SCA API を使用して、 EJB 参照を解決し (前のステップで作成した EJB 参照の名前を入力してください)、 この参照と等しい private 変数を設定します。
    // Locate the EJB service
    this.ejbService = (YourEJBInterface)
    ServiceManager.INSTANCE.locateService("name-of-your-ejb-reference");
生成された Java 実装クラスの中にあるそれぞれの「//TODO」について、 以下のようにします。
  1. すべてのパラメーターを、EJB が期待するパラメーター・タイプに変換します。
  2. SCA プログラミング・モデルを使用して、EJB 参照上の該当メソッドを呼び出し、 変換されたパラメーターを送信します。
  3. EJB の戻り値を、生成された Java 実装メソッドによって宣言された戻り値の型に変換します。
/**
* Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
public BusObjImpl getStockInfo(String aString) {
BusObjImpl boImpl = null;
try {
// invoke the EJB method
StockInfo stockInfo = this.ejbService.getStockInfo(aString);
// formulate the SCA data object to return.
boImpl = (BusObjImpl)
this.boFactory.createByClass(StockInfo.class);
// manually convert all data from the EJB return type into the
// SCA data object to return
boImpl.setInt("index", stockInfo.getIndex());
boImpl.setString("symbol", stockInfo.getSymbol());
boImpl.setDouble("price", stockInfo.getPrice());
} catch (RemoteException e) {
e.printStackTrace();
}
return boImpl;
}
/**
* Method generated to support the implementing WSDL port type named
* "interface.MyBean".
*/
public void setStockPrice(String symbol, Float newPrice) {
try {
this.ejbService.setStockPrice(symbol, newPrice.floatValue());
} catch (RemoteException e) {
e.printStackTrace();
}
}

Feedback
(C) Copyright IBM Corporation 2005, 2006. All Rights Reserved.
(C) Copyright IBM Japan 2006