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

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

 Previous Next Contents PDF で侮ヲ  

WebLogic Web サービスの作成 : 簡単な例

この章では、WebLogic Web サービスの簡単な作成例について説明します。

 


サンプルの解説

この例では、WL_HOME¥samples¥server¥src¥examples¥webservices¥complex¥statelessSession ディレクトリに製品例として格納されている WebLogic Web サービスの実装、アセンブル、およびデプロイのプロセスを始めから終わりまで説明します。WL_HOME は WebLogic プラットフォームのメイン ディレクトリです。

この例では、WebLogic Web サービスをステートレス セッション EJB に基づいて作成する方法を示します。この例では、Trader EJB (WL_HOME¥samples¥server¥src¥examples¥ejb20¥basic¥statelessSession ディレクトリにある EJB 2.0 対応サンプルの 1 つ) を使用しています。

Trader EJB では、入力として株式シンボルである String と購入または売却する株数である int を受け取る、buy()sell() という 2 つのメソッドが定義されています。これらのメソッドはともに、TraderResult という非組み込みデータ型を返します。

Trader EJB が Web サービスに変換されると、この 2 つのメソッドは、この Web サービスの WSDL で定義されるパブリック オペレーションとなります。Client.java アプリケーションは、JAX-RPC クライアント API を使用してオペレーションを呼び出す SOAP メッセージを作成します。

 


WebLogic Web サービスの作成例 : 主な手順

Trader WebLogic Web サービスのサンプルを作成するには、次の手順に従います。

  1. 環境を設定します。

    Windows NT では、setExamplesEnv.cmd コマンドを実行します。このコマンドは、WL_HOME¥samples¥server¥config¥examples ディレクトリにあります。WL_HOME は WebLogic プラットフォームのメイン ディレクトリです。

    UNIX では、setEnv.sh コマンドを実行します。このコマンドは、WL_HOME/samples/server/config/examples ディレクトリにあります。WL_HOME は WebLogic プラットフォームのメイン ディレクトリです。

  2. Trader ステートレス セッション EJB 用の Java インタフェースおよびクラスを記述します。

    EJB 用の Java コードの記述を参照してください。

  3. TradeResult 非組み込みデータ型の Java コードを記述します。

    非組み込みデータ型の Java コードの記述を参照してください。

  4. この Java コードをクラス ファイルにコンパイルします。

  5. EJB デプロイメント記述子を作成します。

    EJB デプロイメント記述子の作成を参照してください。

  6. EJB クラス ファイルおよびデプロイメント記述子を trader.jar アーカイブ ファイルにアセンブルします。

    EJB のアセンブルを参照してください。

  7. build.xml Ant ビルド ファイルを作成します。このファイルは、WebLogic Web サービスのアセンブルに使用する servicegen Ant タスクを実行します。

    build.xml Ant ビルド ファイルの作成を参照してください。

  8. ステージング ディレクトリを作成します。

  9. EJB trader.jar ファイルおよび build.xml ファイルをステージング ディレクトリにコピーします。

  10. Java Ant ユーティリティを実行して Trader Web サービスを trader.ear アーカイブ ファイルにアセンブルします。
    $ ant

  11. テストするため、trader.ear アーカイブ ファイルを domain/applications ディレクトリにコピーして、Trader Web サービスを WebLogic Server に自動デプロイします。ここで、domain はユーザのドメインの場所を示しています。

  12. ブラウザで次の URL を入力して Trader Web サービスのホーム ページを表示します。
    http://localhost:port/webservice/TraderService

    各要素の説明は次のとおりです。

    Web サービスのホーム ページから、生成された WSDL を表示し、Web サービスが正しく機能するようテストすることができます。

Java クライアント アプリケーションから Trader Web サービスを呼び出す方法については、WL_HOME¥samples¥server¥src¥examples¥webservices¥complex¥statelessSession ディレクトリにある Client.java ファイルを参照してください。

クライアントアプリケーションを作成、実行する方法については、WL_HOME¥samples¥server¥src¥examples¥webservices¥complex¥statelessSession¥package-summary.html Web ページをブラウザで呼び出してください。

 


EJB 用の Java コードの記述

サンプルの Trader ステートレス セッション EJB には、buy()sell() という 2 つのパブリック メソッドがあります。Trader EJB では、入力として株式シンボルである String と購入または売却する株数である int を受け取る、buy()sell() という 2 つのメソッドが定義されています。これらのメソッドはともに、TraderResult という非組み込みデータ型を返します。

次の Java コードは、Trader EJB のパブリック インタフェースです。

package examples.webservices.complex.statelessSession;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
/**
* このインタフェース内のメソッドは TraderBean のパブリック インタフェース
* これらのメソッドのシグネチャは EJBean のシグネチャと同じだが、
* java.rmi.RemoteException を送出する点で異なる
* EJBean はこのインタフェースを実装していないことに注意すること。対応する
* コード生成の EJBObject である TraderBean は、このインタフェースを実装し
* Bean に委託する
*
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public interface Trader extends EJBObject {
/**
* 株式を購入する
*
* @param stockSymbol String 株式シンボル
* @param shares int 売却する株数
* @return TradeResult 取引結果
* @exception 通信またはシステムに障害がある場合は
* RemoteException を送出
*/
public TradeResult buy (String stockSymbol, int shares)
throws RemoteException;
/**
* 株式を売却する
*
* @param stockSymbol String 株式シンボル
* @param shares int 売却する株数
* @return TradeResult 取引結果
* @exception 通信またはシステムに障害がある場合は
* RemoteException を送出
*/
public TradeResult sell (String stockSymbol, int shares)
throws RemoteException;
}

次の Java コードは、実際の ステートレス セッション EJB クラスです。

package examples.webservices.complex.statelessSession;
import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* TraderBean は、ステートレス セッション Bean。この Bean は以下を表す
* <ul>
* <li> セッション Bean への呼び出しと呼び出しの間に永続性はない
* <li> 環境から値をルックアップ
* </ul>
*
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public class TraderBean implements SessionBean {
  private static final boolean VERBOSE = true;
private SessionContext ctx;
private int tradeLimit;
  // WebLogic のログ サービスの使用も検討すること
private void log(String s) {
if (VERBOSE) System.out.println(s);
}
  /**
* このメソッドは EJB 仕様では必須だが、
* このサンプルでは使用されない
*
*/
public void ejbActivate() {
log("ejbActivate called");
}
  /**
* このメソッドは EJB 仕様では必須だが、
* このサンプルでは使用されない
*
*/
public void ejbRemove() {
log("ejbRemove called");
}
  /**
* このメソッドは EJB 仕様では必須だが、
* このサンプルでは使用されない
*
*/
public void ejbPassivate() {
log("ejbPassivate called");
}
  /**
* セッション コンテキストを設定
*
* @param ctx SessionContext セッションのコンテキスト
*/
public void setSessionContext(SessionContext ctx) {
log("setSessionContext called");
this.ctx = ctx;
}
  /**
* このメソッドは、ホーム インタフェース「WeatherHome.java」の create
* メソッドに対応する
* 2 つのメソッドのパラメータ セットは同じ。クライアントが
* <code>TraderHome.create()</code> を呼び出すと、コンテナは、EJBean
* のインスタンスを割り当てて <code>ejbCreate()</code> を呼び出す
*
* @exception 通信またはシステムに障害がある場合は
* RemoteException を送出
* @see examples.ejb11.basic.statelessSession.Trader
*/
public void ejbCreate () throws CreateException {
log("ejbCreate called");
try {
InitialContext ic = new InitialContext();
Integer tl = (Integer) ic.lookup("java:/comp/env/tradeLimit");
tradeLimit = tl.intValue();
} catch (NamingException ne) {
throw new CreateException("Failed to find environment value "+ne);
}
}
  /**
* 指名された顧客に代わって株式を購入
*
* @param customerName String 顧客の名前
* @param stockSymbol String 株式シンボル
* @param shares int 売却する株数
* @return TradeResult 取引結果
* 株式の購入中にエラーがある場合
*/
public TradeResult buy(String stockSymbol, int shares) {
if (shares > tradeLimit) {
log("Attempt to buy "+shares+" is greater than limit of "+tradeLimit);
shares = tradeLimit;
}
log("Buying "+shares+" shares of "+stockSymbol);
return new TradeResult(shares, stockSymbol);
}
  /**
* 指名された顧客に代わって株式を売却
*
* @param customerName String 顧客の名前
* @param stockSymbol String 株式シンボル
* @param shares int 売却する株数
* @return TradeResult 取引結果
* 株式の売却中にエラーがある場合
*/
public TradeResult sell(String stockSymbol, int shares) {
if (shares > tradeLimit) {
log("Attempt to sell "+shares+" is greater than limit of "+tradeLimit);
shares = tradeLimit;
}
log("Selling "+shares+" shares of "+stockSymbol);
return new TradeResult(shares, stockSymbol);
}
}

次の Java コードは、Trader EJB のホーム インタフェースです。

package examples.webservices.complex.statelessSession;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
/**
* このインタフェースは、TraderBean.java のホーム インタフェース
* WebLogic では、コード生成のコンテナ クラスである TraderBeanC
* によって実装される。ホーム インタフェースは、EJBeanで「ejbCreate」
* というメソッドに必ず対応する 1 つまたは複数の create メソッドをサポートできる
*
* @author Copyright (c) 1998-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public interface TraderHome extends EJBHome {
/**
* このメソッドは、「WeatherBean.java」の ejbCreate
* メソッドに対応する
* 2 つのメソッドのパラメータ セットは同じ。クライアントが
* <code>TraderHome.create()</code> を呼び出すと、コンテナは
* EJBean のインスタンスを割り当てて <code>ejbCreate()</code> を呼び出す
*
* @return Trader
* @exception 通信またはシステムに障害がある場合は
* RemoteException を送出
* @exception Bean の作成時に問題が生じた場合は
* CreateExceptionを送出
* @see examples.ejb11.basic.statelessSession.TraderBean
*/
Trader create() throws CreateException, RemoteException;
}

 


非組み込みデータ型の Java コードの記述

EJB の 2 つのメソッドは、TraderResult という非組み込みデータ型を返します。次の Java コードは、この型を記述しています。

package examples.webservices.complex.statelessSession;
import java.io.Serializable;
/**
* このクラスは、売買結果を反映する
*
* @author Copyright (c) 1999-2002 by BEA Systems, Inc. All Rights Reserved.
*/
public final 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;
}
}

 


EJB デプロイメント記述子の作成

BEA XML エディタを使用した ejb-jar.xml ファイルおよび weblogic-ejb-jar.xml ファイルの作成および編集については、XML ファイルの編集を参照してください。

次の例は、Trader EJB に関する ejb-jar.xml デプロイメント記述子を示しています。

<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC
'-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN'
'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>TraderService</ejb-name>
<home>examples.webservices.complex.statelessSession.TraderHome</home>
<remote>examples.webservices.complex.statelessSession.Trader</remote>
<ejb-class>examples.webservices.complex.statelessSession.TraderBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<env-entry>
<env-entry-name>WEBL</env-entry-name>
<env-entry-type>java.lang.Double </env-entry-type>
<env-entry-value>10.0</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>INTL</env-entry-name>
<env-entry-type>java.lang.Double </env-entry-type>
<env-entry-value>15.0</env-entry-value>
</env-entry>
<env-entry>
<env-entry-name>tradeLimit</env-entry-name>
<env-entry-type>java.lang.Integer </env-entry-type>
<env-entry-value>500</env-entry-value>
</env-entry>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>TraderService</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>

次の例は、Trader EJB に関する weblogic-ejb-jar.xml デプロイメント記述子を示しています。

<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC
'-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN'
'http://www.bea.com/servers/wls700/dtd/weblogic700-ejb-jar.dtd'>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>TraderService</ejb-name>
<jndi-name>webservices-complex-statelessession</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>

 


EJB のアセンブル

EJB クラス ファイルおよびデプロイメント記述子を trader.jar アーカイブ ファイルにアセンブルするには、次の手順に従います。

  1. 一時的なステージング ディレクトリを作成します。

  2. コンパイル済みの Java EJB クラス ファイルをステージング ディレクトリにコピーします。

  3. ステージング ディレクトリに META-INF サブディレクトリを作成します。

  4. META-INF サブディレクトリに ejb-jar.xml および weblogic-ejb-jar.xml デプロイメント記述子をコピーします。

  5. jar ユーティリティを使用して pre_trader.jar アーカイブ ファイルを作成します。
    jar cvf pre_trader.jar -C staging_dir .

  6. weblogic.ejbc ユーティリティを実行して、EJB 2.0 および 1.1 のコンテナ クラスを生成、コンパイルして、最終的に trader.jar ファイルを作成します。
    java weblogic.ejbc pre_trader.jar trader.jar

 


build.xml Ant ビルド ファイルの作成

Ant ビルド ファイル build.xml には、servicegen Ant タスクへの呼び出しが入っています。このタスクは、trader.jar EJB ファイルを参照し、すべてのデータ型コンポーネント (シリアライゼーション クラスなど) を生成し、web-services.xml デプロイメント記述子ファイルを作成し、そのすべてをデプロイ可能な trader.ear ファイルにパッケージ化します。

次の build.xml ファイルには、EAR ファイルを一時的な build_dir ディレクトリに作成する指示が記述されています。

<project name="webServicesExample" default="build">
<target name="build" >
<delete dir="build_dir" />
<mkdir dir="build_dir" />
<copy todir="build_dir" file="trader.jar"/>
<servicegen
destEar="build_dir/trader.ear"
warName="trader.war"
contextURI="webservice">
<service
ejbJar="build_dir/trader.jar"
targetNamespace="http://www.bea.com/examples/Trader"
serviceName="TraderService"
serviceURI="/TraderService"
generateTypes="True"
expandMethods="True" >
</service>
</servicegen>
</target>
</project>

 

Back to Top Previous Next