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

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

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

WebLogic Web サービスでの WebLogic Workshop の使用

この章では、WebLogic Workshop を使用して WebLogic Web サービスを作成する方法について説明します。

 


WebLogic Workshop と WebLogic Web サービスの概要

このドキュメントでは、WebLogic Platform (Workshop IDE) のさまざまな技術を使用して WebLogic Web サービスを作成する例とシナリオを紹介します。概要情報は、以下のトピックに分かれています。

WebLogic Workshop と WebLogic Web サービス

現在の Java には、Web サービスを開発するためのプログラミング モデルが主に 2 つあります。それらのモデルは両方とも BEA でサポートされています。最初のモデルは、JAX-RPC で定義されています。JAX-RPC は、バックエンド EJB またはプレーンの Java オブジェクトを利用して Web サービスのビジネス ロジックを提供します。このモデルを使用して Web サービスを開発するには、WebLogic Web サービスの Ant タスク (servicegen など) を使用できます。2 つめのモデルは、JSR-181、Web Services Metadata for the Java Platform で定義されているコードのアノテーションをベースとしています。WebLogic Workshop で Web サービスを開発するために使用するモデルは、JSR-181 の先駆的な存在です。JAX-RPC モデルと WebLogic Workshop モデルのどちらを選択するかに関係なく、開発した Web サービスは WebLogic Server にデプロイされて実行されますが、SOAP の実装とディスパッチ モデルは選択したプログラミング モデルによって異なります。

通常、SOAP 実装のこの違いは表面に現れず重要ではありません。ただし、プログラミング モデルの違いと 2 つのランタイムの特性における微かな違いにより、場合によっては、WebLogic Workshop を使用して、JAX-RPC プログラミング モデルでサポートされるランタイムで動作するアプリケーションを作成することが必要になります。その目的のために、アノテーション付きの JWS ファイルを使用することはできません (WebLogic Workshop で Web サービスを作成する標準的な方法)。その代わりに、WebLogic Workshop を使用してバックエンド コンポーネント (ステートレス セッション EJB) を作成し、その EJB とコンポーネントをビルドする Ant ビルド スクリプトをエクスポートして、それから、ビルド スクリプトに Web サービスの Ant タスクの呼び出しを追加し、JAX-RPC モデルでサポートされているランタイムで動作する Web サービスにすべてをパッケージ化します。このドキュメントで紹介する例は、このプロセスを行う方法を示しています。

EJB を WebLogic Workshop から JAR ファイルにエクスポートしたら、このマニュアルで概説されている標準のガイドラインに従って、JAX-RPC プログラミング モデルでサポートされているランタイムで動作する Web サービスを作成します。特に、以下の箇所を参照してください。

EJBGen

WebLogic Workshop を使用してステートレス セッション EJB のバックエンド コンポーネントを作成するときには、EJBGen というプラグイン (EJB 2.0 コード ジェネレータ) を使用することになります。Workshop で EJB のコードを記述するときには、特殊な @ejbgen Javadoc タグを使用して EJB がどのようになるのかを記述します。その次に、EJB をビルドするときには、Workshop が EJBGen プラグインを呼び出して、リモートおよびホームのインタフェース クラスとデプロイメント記述子ファイルを生成します。

EJBGen は、コマンドライン ユーティリティとして実行することもできます。つまり、Workshop で使用する同じ *.ejb ファイルを Workshop の外で処理することもできるということです (唯一の違いは *.ejb から *.java に拡張子を変更する必要があること)。java コマンドは、次の例のように使用します。

java weblogic.tools.ejbgen.EJBGen myEJB.java

コマンドライン バージョンの EJBGen を使用する 1 つの方法は、それを servicegen などの Ant タスクを呼び出す Ant ビルド スクリプトに追加し、Workshop を使用する必要なく EJB を再生成できるように WebLogic Web サービスを構築することです。

EJBGen は Workshop 内で使用することもコマンドライン ユーティリティとして使用することもできるので、このドキュメントの例ではどちらか特定の手段が使用されていても、どちらでも使用できることが想定されています。

コマンドラインの EJBGen ツールの詳しい使い方については、「EJBGen リファレンス」を参照してください。EJBGen Workshop プラグインの詳細については、WebLogic Workshop ヘルプの左フレームのトピック「エンタープライズ JavaBean を開発する」を参照してください。

EJB および Web サービス作成時のメタデータ タグの使い方

このドキュメントの例は、Java ソース コード ファイルでメタデータ タグを使用して Web サービスを作成する方法を示しています。そのメタデータ タグには以下の 2 種類があります。

メタデータ Javadoc タグは、EJB (およびその EJB をエクスポーズする Web サービス) がどのようになるのかをより詳しく指定するために Java ソース ファイルで使用します。そして、EJBGen または source2wsdd Ant タスク (あるいは両方) を使用して追加のコンポーネントを生成します。特に、EJBGen は EJB デプロイメント記述子と EJB のホームおよびリモート インタフェースを生成します。source2wsdd Ant タスクの方は、Web サービスのデプロイメント記述子ファイルを生成します。

EJBGen タグのリファレンス情報については、「EJBGen リファレンス」を参照してください。source2wsdd タグについては、「source2wsdd タグのリファレンス」を参照してください。

 


WebLogic Workshop での WebLogic Web サービスの作成 : 単純な例

この節では、WebLogic Workshop IDE を使用して WebLogic Web サービスを作成する単純な例を説明します。

注意 : この手順は、WebLogic Workshop のサービス パック 2 でのみ有効です。WebLogic Workshop の GA バージョンで有効な例については、「WebLogic Workshop での WebLogic Web サービスの作成 : 複雑な例」を参照してください。

この例ではまず、Workshop を使用して PurchaseOrderBean というステートレス セッション EJB を作成し、それから servicegen WebLogic Web サービス Ant タスクを使用して、JAX-RPC プログラミング モデルでサポートされているランタイムで動作する Web サービスとして EJB をエクスポーズします。この例のすべてのビジネス ロジックは、PurchaseOrderBean に直に置かれています。この EJB は、2 つのメソッド submitPOgetStatus を Web サービスのオペレーションとしてエクスポーズします。

注意 : 次の手順は、さまざまなプロジェクトやオブジェクトを作成するために IDE で実行しなければならない手順を必ずしも正確には説明していません。この種の詳しい情報については、WebLogic Workshop ヘルプの左フレームのトピック「エンタープライズ JavaBean を開発する」を参照してください。

  1. [スタート] メニューから WebLogic Workshop を起動します。
  2. まだない場合は、ステートレス セッション EJB を格納するアプリケーションを作成します。
  3. この手順では、アプリケーションの名前を myApp とします。

  4. まだない場合は、Workshop アプリケーションの下に EJB プロジェクトを作成します。
  5. ここでは、プロジェクトの名前を myEJBs とします。

  6. EJB プロジェクトの下にフォルダを作成します。
  7. ここでは、フォルダの名前を myPackage とします。

  8. myPackage フォルダの下にセッション Bean を作成します。
  9. ここでは、EJB の名前を PurchaseOrderBean.ejb とします。

  10. ソース ビューをクリックして、PurchaseOrderBean.ejb を更新し、package myPackage 文の後のすべてのコードを次のコードに置き換えます。
  11. import javax.ejb.*;
    import weblogic.ejb.*;
    /**
    * @ejbgen:session
    * ejb-name = "PurchaseOrder"
    *
    * @ejbgen:jndi-name
    * remote = "ejb.PurchaseOrderRemoteHome"
    *
    * @ejbgen:file-generation
    * remote-class = "true"
    * remote-class-name = "PurchaseOrder"
    * remote-home = "true"
    * remote-home-name = "PurchaseOrderHome"
    * local-class = "false"
    * local-class-name = "PurchaseOrderLocal"
    * local-home = "false"
    * local-home-name = "PurchaseOrderLocalHome"
    */
    public class PurchaseOrderBean
    extends GenericSessionBean
    implements SessionBean
    {
    public void ejbCreate() {
    // ここにコードが入る
    }
        /**
    * @ejbgen:remote-method
    */
    public long submitPO(String PoText)
    {
    return System.currentTimeMillis();
    }
        /**
    * @ejbgen:remote-method
    */
    public int getStatus(long orderNo)
    {
    return 0;
    }
    }
  12. アプリケーション ペインで myEJBs プロジェクトを右クリックし、[myEJBs のビルド] を選択して、EJB が正しくビルドされるようにします。
  13. [ツール|アプリケーション プロパティ] をクリックして、左ペインで [ビルド] を選択し、[Ant ファイルにエクスポート] ボタンをクリックして、Workshop の外部で PurchaseOrder EJB をビルドする Ant ビルド ファイルをエクスポートします。
  14. Workshop アプリケーションのプロジェクト ディレクトリに exported_build.xml というファイルが生成されます。

    右ペインの [EAR] の下にあるプロジェクト ディレクトリをメモしておいてください。

  15. コマンド ウィンドウを開き、Workshop アプリケーションのプロジェクト ディレクトリに切り替えます。
  16. exported_build.xml ファイルを編集し、Workshop で作成した PurchaseOrder EJB で servicegen Ant タスクを呼び出す以下の要素を追加します。
  <taskdef name="servicegen"
classname="weblogic.ant.taskdefs.webservices.servicegen.ServiceGenTask"
classpath="${server.classpath}" />
 <target name="servicegen">
<delete file="${output.file}" />
<servicegen
destEar="${output.file}"
>
<service
ejbJar="myEJBs.jar"
serviceName="PurchaseOrderService"
serviceURI="/PurchaseOrderService"
targetNamespace="http://example.com/PurchaseOrderService"
/>
</servicegen>
</target>
  1. ドメイン ディレクトリにある setEnv.cmd コマンドを実行して環境を設定します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME\user_projects\domains\domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
  2. 次のように、exported_build.xml ファイルの build および servicegen Ant タスクを実行します。
  3. prompt> ant -f exported_build.xml build servicegen

    この Ant タスクの servicegen ターゲットでは、アプリケーションを更新して、PurchaseOrder EJB を WebLogic Web サービスとしてエクスポーズします。

  4. 通常通りにアプリケーションをデプロイします。詳細については、「WebLogic Web サービスのデプロイとテスト」を参照してください。

 


WebLogic Workshop での WebLogic Web サービスの作成 : 複雑な例

この節では、WebLogic Workshop IDE を使用して WebLogic Web サービスを作成するより複雑な例を説明します。

例の解説

この例の PurchaseOrderServiceBean EJB は Web サービスとしてエクスポーズされますが、ビジネス ロジックは含まれません。受信 SOAP リクエストから発注番号を受け付け、SOAP 応答で PurchaseOrder オブジェクトを返す 1 つのオペレーションを持ちます。Web サービスとしてエクスポーズされた PurchaseOrderServiceBean EJB は、発注をルックアップする実際のすべての作業を PurchasingManagerBean という従来型のセッション Facade EJB に委託します。この EJB は、Web サービスのエントリ ポイントと関係なくアプリケーションのすべてのビジネス ロジックを実装します。この EJB は、発注を処理するときに Item および PurchaseOrder 複合データ型を使用し、PurchaseOrderFactory を使用して新しい PurchaseOrder オブジェクトを作成します。

PurchaseOrderServiceBean EJB は、前の例のように EJBGen Javadoc タグを使用するだけでなく、WebLogic Web サービスの source2wsdd タグ (@wlws プレフィックスで識別) も使用します。メタデータ タグを使用するため、この例では総合的な servicegen Ant タスクではなく個々の Ant タスク (source2wsddautotype など) を使用して Web サービスをアセンブルします。source2wsdd タグの詳細については、「source2wsdd タグのリファレンス」を参照してください。

この例は、SOAP メッセージ ハンドラの使い方も示します。SOAP メッセージ ハンドラはクライアントからの SOAP リクエストで My-Username という SOAP ヘッダを探し、それがある場合は、値を抽出して、名前が含まれるメッセージをログ ファイルに記録します。ヘッダがない場合、SOAP メッセージ ハンドラは Unknown をユーザ名としてメッセージをログに記録します。SOAP メッセージ ハンドラの詳細については、「SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの作成」を参照してください。

前提

この例のメイン ポイントは、WebLogic Workshop を使用して、Web サービスとして一緒にエクスポーズされる EJB と SOAP メッセージ ハンドラを作成する方法、そして JAX-RPC プログラミング モデルでサポートされているランタイムで動作するデプロイ可能な EAR ファイルにすべてを一緒にパッケージ化する方法を示すことです。このため、以下のことが前提となっています。

注意 : 次の手順は、さまざまなプロジェクトやオブジェクトを作成するために IDE で実行しなければならない手順を必ずしも正確には説明していません。この種の詳しい情報については、WebLogic Workshop ヘルプの左フレームのトピック「エンタープライズ JavaBean を開発する」を参照してください。

  1. [スタート] メニューから WebLogic Workshop を起動します。
  2. service という PurchaseOrderService EJB プロジェクトの下にフォルダを作成します。
  3. PurchaseOrderServiceBean.ejb というセッション Bean を service フォルダに作成します。
  4. ソース ビューをクリックして、PurchaseOrderBean.ejb を更新し、Workshop で生成されたすべての Java コードを次のコードに置き換えます。
package service;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import po.PurchasingManagerLocal;
import po.PurchasingManagerLocalHome;
/**
* これは Web サービスの Facade であり、 Web サービスのオペレーションを定義し、
* Web サービス固有のアプリケーション ロジック (ハンドラでの呼び出しのログ記録など)
* を格納する
*
* @ejbgen:session
* ejb-name = "PurchaseOrderServiceEJB"
* @ejbgen:jndi-name
* local = "PurchaseOrderService"
* @ejbgen:ejb-local-ref
* link = "PurchasingManagerEJB"
* @wlws:webservice
* name="PurchaseOrderService"
* targetNamespace="http://openuri.org/easypo_service"
* style="document"
*/
public class PurchaseOrderServiceBean implements SessionBean {
     // PurchasingManager セッション Facade のローカル インタフェース
PurchasingManagerLocal pm = null;
    /**
* このオペレーションは PurchasingManager から取得した PurchaseOrder を
* 返す
     *  @ejbgen:local-method
* @wlws:operation handler-chain = "PurchaseOrderServiceHandlerChain"
*/
public po.PurchaseOrder getPurchaseOrder(String poNumber) {
return pm.getPO(poNumber);
}
public void ejbCreate() throws CreateException {
try {
InitialContext ctx = new InitialContext();
PurchasingManagerLocalHome pmhome = (PurchasingManagerLocalHome) ctx.lookup("java:/comp/env/ejb/PurchasingManagerEJB");
pm = pmhome.create();
} catch (NamingException ne) {
throw new CreateException("Could not locate PurchasingManager EJB");
}
}
    public void ejbRemove() {
}
    public void ejbPassivate() {
}
    public void ejbActivate() {
}
    public void setSessionContext(SessionContext ctx) {
}
}
  1. PurchaseOrderServiceHandler.java という Java クラスを service フォルダに作成します。このクラスは、サーバサイドの SOAP メッセージ ハンドラを実装します。
  2. 中央のペインで、PurchaseOrderServiceHandler.java の Workshop で生成されたすべての Java コードを次のコードに置き換えます。
package service;
import javax.xml.rpc.handler.Handler;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.namespace.QName;
import javax.xml.soap.*;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Iterator;
import java.util.Date;
/**
* 受信 SOAP メッセージをインターセプトし、「My-Username」というオプション ヘッダ
* を抽出して、メッセージをログ ファイルに記録する JAX-RPC ハンドラ
* を表す
*/
public class PurchaseOrderServiceHandler implements Handler {
private static final String HEADER_NAME = "My-Username";
private PrintWriter out;
    public QName[] getHeaders() {
return new QName[]{new QName(HEADER_NAME)};
}
    public boolean handleRequest(MessageContext messageContext) {
String userName = null;
try {
userName = getHeaderValue(messageContext, HEADER_NAME);
} catch (SOAPException e) {
throw new RuntimeException("Could not retrieve header value", e);
}
if (userName == null) userName = "UNKNOWN";
out.println(new Date() + ": Received request from username " + userName);
out.flush();
return true;
}
    public boolean handleResponse(MessageContext messageContext) {
return true;
}
    public boolean handleFault(MessageContext messageContext) {
return true;
}
    public void init(HandlerInfo handlerInfo) {
Map config = handlerInfo.getHandlerConfig();
String logFileName = (String) config.get("logFile");
if (logFileName == null) {
throw new RuntimeException("Could not initialize handler; logFile not specified in init-params.");
}
try {
out = new PrintWriter(new FileWriter(logFileName));
} catch (IOException e) {
throw new RuntimeException("Could not initialize handler; could not open log file " + logFileName, e);
}
}
    public void destroy() {
out.close();
}
    private static String getHeaderValue(MessageContext messageContext, 
String headerName) throws SOAPException {
SOAPFactory fact = SOAPFactory.newInstance();
SOAPMessageContext ctx = (SOAPMessageContext) messageContext;
SOAPHeader headers =
ctx.getMessage().getSOAPPart().getEnvelope().getHeader();
        Iterator i = headers.getChildElements(fact.createName(HEADER_NAME));
while (i.hasNext()) {
SOAPElement elt = (SOAPElement) i.next();
if (headerName.equals(elt.getElementName().getLocalName())) {
return elt.getValue();
}
}
return null;
}
}
  1. service フォルダに handler-chain.xml という XML ファイルを作成します。
  2. この XML ファイルでは、Web サービスで使用される SOAP メッセージ ハンドラとハンドラ チェーンが記述されます。このファイルは後で、Web サービスのデプロイメント記述子を生成するときに source2wsdd Ant タスクで使用されます。

  3. 中央のペインで、Workshop で生成された <root></root> XML 要素を次の XML に置き換えます。
  4. <handler-chains>
    <handler-chain name="PurchaseOrderServiceHandlerChain">
    <handler class-name="service.PurchaseOrderServiceHandler">
    <init-params>
    <init-param name="logFile" value="./posvc.log" />
    </init-params>
    </handler>
    </handler-chain>
    </handler-chains>
  5. [ツール|アプリケーション プロパティ] をクリックして、左ペインで [ビルド] を選択します。右ペインの [EAR] の下にあるプロジェクト ディレクトリをメモしておいてください。
  6. コマンド ウィンドウを開き、Workshop アプリケーションのプロジェクト ディレクトリに切り替えます。
  7. ドメイン ディレクトリにある setEnv.cmd コマンドを実行して環境を設定します。WebLogic Server ドメインのデフォルトの位置は、BEA_HOME\user_projects\domains\domainName です。BEA_HOME は BEA Products の最上位のインストール ディレクトリで、domainName はドメインの名前です。
  8. WL_HOME\workshop\wlwBuild.cmd を実行して EJB プロジェクトをコマンドラインから再ビルドできるようにします。WL_HOME は、WebLogic Platform のメイン ディレクトリ (c:\beahome\weblogic81 など) です。次の例のように、-project オプションを使用すると、EJB プロジェクトの名前を渡すことができます。
  9. prompt> c:\beahome\weblogic81\workshop\wlwBuild.cmd -project PurchaseOrderService

    この行は、アプリケーションを反復的にビルドする自動シェル スクリプトに追加できます。

  10. Workshop のプロジェクト ディレクトリで、autotype および source2wsdd WebLogic Web サービス Ant タスクの呼び出しが含まれる Ant build.xml ファイルを作成します。
  11. これらの Ant タスクはコンパイルされた EJB および SOAP メッセージ ハンドラのクラスを受け取り、デプロイメント記述子やデータ型コンポーネントなどの必要な Web サービス コンポーネントを作成します。このファイルの例については、「build.xml ファイルのサンプル」を参照してください。

  12. 次のように、ant コマンドを実行して Ant タスクを実行します。
  13. prompt> ant

    サンプルと同様の build.xml ファイルを使用する場合、Ant タスクは Workshop のプロジェクト ディレクトリと同列の output というディレクトリに PurchaseOrderService.ear というデプロイ可能な EAR ファイルを作成します。

  14. PurchaseOrderService.ear ファイルを通常通りにデプロイします。詳細については、「WebLogic Web サービスのデプロイとテスト」を参照してください。

build.xml ファイルのサンプル

<project name="build-scenario1" default="build">
    <!-- WebLogic ホーム -->
<property name="platformhome" value="/home/toddk/bea/weblogic81"/>
    <!-- サーバの基本 url、管理ユーザ、パスワード -->
<property name="server_url" value="http://localhost:7001"/>
<property name="admin_user" value="weblogic"/>
<property name="admin_passwd" value="gumby1234"/>
    <!-- ブラウザの実行ファイルの位置 -->
<property name="browser"
value="/usr/local/MozillaFirebird/MozillaFirebird"/>
    <!-- コンパイラとツールの出力が格納されるディレクトリ -->
<property name="output_dir" value="../output"/>
    <!-- サービスの名前 (war ファイル名、WSDL などの作成で使用) -->
<property name="service_name" value="PurchaseOrderService"/>
    <!-- サービス クラスが配置される Java パッケージ -->
<property name="service_package" value="service"/>
    <!-- サービスの対象ネームスペース  -->
<property name="target_namespace"
value="http://openuri.org/easypo_service"/>
    <!-- Web サービスの EJB が格納される Workshop EJB プロジェクトの名前 -->
<property name="service_ejb_project" value="PurchaseOrderService" />
    <!-- Web サービスが含まれる展開 ear ファイルが格納されるディレクトリ -->
<property name="output_ear" value="${output_dir}/${service_name}-ear"/>
<path id="build.classpath">
<pathelement path="${java.class.path}"/>
<pathelement location="${platformhome}/server/lib/webservices.jar"/>
<pathelement location="${output_ear}"/>
<pathelement location="${output_ear}/APP-INF/classes"/>
<pathelement location="${service_ejb_project}.jar"/>
</path>
<target name="build"
depends="clean, setup, webservice.build, webservice.client, build.finish"/>
<target name="clean" description="delete generated stuff">
<delete dir="${output_dir}"/>
</target>
    <target name="setup" description="create output directories">
<mkdir dir="${output_ear}/META-INF"/>
<mkdir dir="${output_dir}/${service_name}-war/WEB-INF"/>
</target>
    <!-- Web サービスの EJB JAR から Web サービスをビルドする -->
<target name="webservice.build">
        <!-- EJB JAR を展開 EAR に入れる -->
<copy file="${service_ejb_project}.jar" todir="${output_ear}" />
        <!-- サービスの Java 値型から XML の型を生成する -->
<autotype javaComponents="${service_package}.${service_name}Local"
typeMappingFile="${output_ear}/APP-INF/classes/types.xml"
destDir="${output_ear}/APP-INF/classes"
packageName="${service_package}"
classpathref="build.classpath"/>
        <!-- EJB および autotyper の型からサービスをビルドする -->
<source2wsdd
javaSource="${service_ejb_project}/${service_package}/${service_name}Bean.ejb"
ddFile="${output_dir}/${service_name}-war/WEB-INF/web-services.xml"
typesInfo="${output_ear}/APP-INF/classes/types.xml"
handlerInfo="${service_ejb_project}/${service_package}/handler-chain.xml"
serviceURI="/${service_name}"
wsdlFile="${output_dir}/${service_name}-war/${service_name}.wsdl"
ejblink="${service_ejb_project}.jar#${service_name}EJB"
classpathref="build.classpath">
</source2wsdd>
        <!-- web サービスの war をパッケージ化する -->
<jar destFile="${output_ear}/${service_name}.war" basedir="${output_dir}/${service_name}-war"/>
        <!-- ear をパッケージ化する -->
<echo file="${output_ear}/META-INF/application.xml">
<![CDATA[
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.2//EN'
'http://java.sun.com/j2ee/dtds/application_1_2.dtd'>
<application>
<display-name> ${service_name}-Service </display-name>
<module>
<ejb>
${service_ejb_project}.jar
</ejb>
</module>
<module>
<web>
<web-uri> ${service_name}.war </web-uri>
<context-root> ${service_name} </context-root>
</web>
</module>
</application>
]]>
</echo>
<jar destFile="${output_dir}/${service_name}.ear" baseDir="${output_ear}"/>
    </target>
    <target name="webservice.client">
        <!-- JAX-RPC クライアント インタフェース (クライアント jar のスタブ) を生成する -->
<clientgen
description="create a web service client from the ear"
clientJar="${output_dir}/${service_name}-client"
wsdl="${output_dir}/${service_name}-war/${service_name}.wsdl"
typeMappingFile="${output_ear}/APP-INF/classes/types.xml"
packageName="${service_package}.client"
usePortNameAsMethodName="true"
keepgenerated="true"
classpathref="build.classpath">
</clientgen>
<!-- クライアント アプリケーションをクライアント jar にコンパイルする -->
<javac srcdir="."
includes="client/*.java"
destdir="${output_dir}/${service_name}-client"
classpathref="build.classpath">
</javac>
        <!-- クライアント jar をパッケージ化する。jar を実行すると、テスト アプリケーションが実行される -->
<jar
destFile="${output_dir}/${service_name}-client.jar"
baseDir="${output_dir}/${service_name}-client"/>
    </target>
    <target name="build.finish" description="clean up temp files">
<delete dir="${output_dir}/${service_name}-client"/>
<delete dir="${output_dir}/${service_name}-war"/>
<delete dir="${output_ear}"/>
</target>
    <target name="deploy" description="deploy service">
<wldeploy action="deploy" source="${output_dir}/${service_name}.ear"
adminurl="${server_url}"
user="${admin_user}" password="${admin_passwd}"/>
</target>
    <target name="undeploy" description="undeploy service">
<wldeploy action="undeploy" source="${output_dir}/${service_name}.ear"
adminurl="${server_url}"
user="${admin_user}" password="${admin_passwd}"/>
</target>
    <target name="browse" description="browse test page for this service">
<exec executable="${browser}">
<arg line="${server_url}/${service_name}/${service_name}"/>
</exec>
</target>
    <target name="run" description="run client">
<java classname="client.Main" fork="true">
<classpath>
<pathelement path="${java.class.path}"/>
<pathelement location="${output_dir}/${service_name}-client.jar"/>
            </classpath>
<arg line="${server_url}/${service_name}/${service_name}?WSDL"/>
<jvmarg line="-Dweblogic.webservice.verbose=true"/>
</java>
</target>
</project>

サポート Java オブジェクトのソース コード

この節では、すでに存在が想定されている以下のサポート Java オブジェクトのサンプル コードを示します。

Item.java

package po;
/**
* 発注書の 1 つの項目を表す
*/
public class Item {
private String catNumber;
private String description;
private int quantity;
    public Item() {
}
    public Item(String catNumber, String description, int quantity) {
this.catNumber = catNumber;
this.description = description;
this.quantity = quantity;
}
    public String getCatNumber() {
return catNumber;
}
    public void setCatNumber(String catNumber) {
this.catNumber = catNumber;
}
    public String getDescription() {
return description;
}
    public void setDescription(String description) {
this.description = description;
}
    public int getQuantity() {
return quantity;
}
    public void setQuantity(int quantity) {
this.quantity = quantity;
}
    public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("[Item");
sbuf.append("\n\tcatNumber = " + catNumber);
sbuf.append("\n\tdescription = " + description);
sbuf.append("\n\tquantity = " + quantity);
sbuf.append("\n]");
return sbuf.toString();
}
}

PurchaseOrder.java

package po;
import po.Item;
/**
* Date: Oct 15, 2003
* Time: 3:29:23 PM
*/
public class PurchaseOrder {
private String poNumber;
private Item[] items;
private String custName;
private String custAddress;
    public PurchaseOrder() {
}
    public PurchaseOrder(String poNumber) {
this.poNumber = poNumber;
}
    public String getPoNumber() {
return poNumber;
}
    public void setPoNumber(String poNumber) {
this.poNumber = poNumber;
}
    public Item[] getItems() {
return items;
}
    public void setItems(Item[] items) {
this.items = items;
}
    public String getCustName() {
return custName;
}
    public void setCustName(String custName) {
this.custName = custName;
}
    public String getCustAddress() {
return custAddress;
}
    public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
    public String toString() {
StringBuffer sbuf = new StringBuffer();
sbuf.append("[PurchaseOrder");
sbuf.append("\n\tpoNumber = " + poNumber);
sbuf.append("\n\tcustName = " + custName);
sbuf.append("\n\tcustAddress = " + custAddress);
if (items != null) {
for (int i = 0; i < items.length; ++i) {
sbuf.append("\n");
sbuf.append(items[i].toString());
}
}
sbuf.append("\n]");
return sbuf.toString();
}
}

PurchasingManagerBean.java

package po;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
* これは、アプリケーションのビジネス ロジックのエントリ ポイントである
* セッション Facade EJB
*
* @ejbgen:session
* ejb-name = "PurchasingManagerEJB"
* @ejbgen:jndi-name
* local = "PurchasingManager"
*/
public class PurchasingManagerBean implements SessionBean {
    /**
* @ejbgen:local-method
*/
public PurchaseOrder getPO(String poNumber) {
return PurchaseOrderFactory.createPO(); // 常に同じものを返す
}
    /**
* @ejbgen:local-method
*/
public int getStatus(String poNumber) {
return 1;
}
    public void ejbRemove() {}
public void ejbCreate() {}
public void ejbPassivate() {}
public void ejbActivate() {}
public void setSessionContext(SessionContext ctx) {}
}

PurchaseOrderFactory.java

package po;
import java.util.ArrayList;
import java.util.List;
/**
* PurchaseOrder を作成するファクトリ。 そのたびに同じダミーの PO
* を作成するのみ
*/
public class PurchaseOrderFactory {
    /**
* PurchaseOrder オブジェクトを作成する
*/
public static PurchaseOrder createPO() {
        PurchaseOrder po = new PurchaseOrder("PO8048392");
        // 顧客を追加する
po.setCustName("Mary Mary Quite Contrary");
po.setCustAddress("123 Main Street, Hogsmeade");
        // 項目を追加する
List items = new ArrayList();
items.add(new Item("S-123", "Lacewing Flies", 100));
items.add(new Item("S-456", "Leeches", 3));
items.add(new Item("S-043", "Powdered Bicon Horn", 1));
items.add(new Item("S-153", "Knotgrass", 5));
items.add(new Item("S-904", "Fluxweed", 1));
items.add(new Item("S-034", "Boomslang Skin", 2));
po.setItems((Item[]) items.toArray(new Item[]{}));
        return po;
}
}

 

フッタのナビゲーションのスキップ  ページの先頭 前 次