BEA ホーム | 製品 | dev2dev | support | askBEA |
|
e-docs > WebLogic Server > WebLogic Web サービス プログラマーズ ガイド > WebLogic Web サービスの作成 : 簡単な例 |
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 メッセージを作成します。
Trader WebLogic Web サービスのサンプルを作成するには、次の手順に従います。
EJB 用の Java コードの記述を参照してください。
非組み込みデータ型の Java コードの記述を参照してください。
EJB デプロイメント記述子の作成を参照してください。
EJB のアセンブルを参照してください。
build.xml Ant ビルド ファイルの作成を参照してください。
$ ant
http://localhost:port/webservice/TraderService
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 ページをブラウザで呼び出してください。
サンプルの 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;
}
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;
}
}
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 クラス ファイルおよびデプロイメント記述子を trader.jar アーカイブ ファイルにアセンブルするには、次の手順に従います。
jar cvf pre_trader.jar -C staging_dir .
java weblogic.ejbc pre_trader.jar trader.jar
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>