BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > WebLogic Web サービス プログラマーズ ガイド > WebLogic Web サービスの実装 |
WebLogic Web サービス プログラマーズ ガイド
|
この章では、WebLogic Web サービスを実装する方法について説明します。
WebLogic Web サービスの実装とは、Web サービスを構成するバックエンド コンポーネントの Java コードを記述し、必要に応じて SOAP メッセージ ハンドラを作成することです。バックエンド コンポーネントには、ステートレス セッション EJB、Java クラス、および JMS メッセージ コンシューマ/プロデューサがあります。Web サービスは、これらのコンポーネントをさまざまに組み合わせて実装することができます。
単一の WebLogic Web サービスは、1 つまたは複数のオペレーションで構成されています。各オペレーションは、異なるバックエンド コンポーネントと SOAP メッセージ ハンドラのメソッドを使用して実装することができます。たとえば、オペレーションは、ステートレス セッション EJB の単一メソッドを使用して実装されている場合、またはSOAP メッセージ ハンドラとステートレス セッション EJB を組み合わせて実装されている場合があります。
既存の WSDL ファイルから WebLogic Web サービスを実装する場合は、WebLogic Server に付属の wsdl2Service Ant タスクを利用して、必要な Java ソース コードの多くを生成できます。この生成されたファイルを土台として使用し、Web サービスを希望通りに機能させるために必要な残りの Java コードを追加できます。
ここでは、WebLogic Web サービスの設計,で説明した設計の問題を読み理解して Web サービスを設計していること、コード化する必要があるコンポーネントのタイプを基本的に理解していることを前提としています。
以下は、WebLogic Web サービスを実装する高度な手順です。このマニュアルの後半で、この手順について詳細に説明します。実装する Web サービスのタイプにより、必須の手順もあれば省略可能なものもあります。
コンポーネントの Java コードの記述を参照してください。
SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの作成を参照してください。
非組み込みデータ型を実装するを参照してください。
WebLogic Web サービスを実装するときには、以下のいずれかのバックエンド コンポーネントの Java コードを記述します。
Java コードの記述については、ステートレス セッション EJB を使用して Web サービスを実装するを参照してください。例については、EJB 用の Java コードの記述を参照してください。
Java コードの記述については、Java クラスを記述して Web サービスを実装するを参照してください。
JMS で実装された WebLogic Web サービスの作成を参照してください。
Web サービス オペレーションで非組み込みデータ型がパラメータまたは戻り値として使用される場合は、非組み込みデータ型を実装するを参照してください。
RPC 指向ではなくドキュメント指向のオペレーションを使用する Web サービスを実装する場合は、ドキュメント指向の Web サービスの実装を参照してください。
既存の WSDL ファイルに基づいて WebLogic Web サービスを実装し、かつその Web サービスを Java クラスを使用して実装する場合には、WebLogic Server に付属の wsdl2Service Ant タスクを利用することで必要な Java コードの多くを生成できます。この Ant タスクを使用する方法の詳細については、WSDL ファイルに基づく部分的な実装の生成を参照してください。
Web サービス実装からの例外の送出については、SOAP 障害例外を送出するを参照してください。
Web サービスのオペレーションで複数の値が返されるようにするには、複数の戻り値の実装を参照してください。
ステートレス セッション EJB を使用して Web サービスを実装する
Web サービスのステートレス セッション EJB の Java コードを記述することは、以下の問題を除けば、スタンドアロン EJB の記述と比べて特に相違はありません。
web-services.xml ファイルで Web サービス オペレーションが一方向となるように指定する方法の詳細は、A-10 ページの「operation」を参照してください。
非組み込みデータ型を実装するを参照してください。
ステートレス セッション EJB の記述例については、EJB 用の Java コードの記述を参照してください。一般的な情報については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。
以下の規則に従い、Java クラスを使用して Web サービス オペレーションを実装することができます。
Java クラスを使用して WebLogic Web サービス オペレーションを実装する例は、WL_HOME¥samples¥server¥src¥examples¥webservices¥basic¥javaclass ディレクトリにあります。WL_HOME は、WebLogic Server のメインのインストール ディレクトリです。
ステートレス セッション EJB あるいは Java クラスは、パラメータや戻り値として必ずしも組み込みデータ型を受け取るとは限りません。自作の Java データ型を使用する場合もあります。非組み込みデータ型の例は TradeResult です。このデータ型には、文字列の株式シンボルと売買される株数を表す整数の 2 つのフィールドがあります。組み込みデータ型のリストは、組み込みデータ型の使用法を参照してください。
バックエンド コンポーネントが、パラメータまたは戻り値として非組み込みデータ型を使用する場合は、XML と Java 間のデータ変換を行うシリアライゼーション クラスを生成または作成する必要があります。それには、以下の 2 通りの方法があります。
警告: autotype、servicegen、および clientgen Ant タスクによって生成されたシリアライザ クラスと Java および XML 表現はラウンドトリップできません。詳細については、生成されたデータ型コンポーネントの非ラウンドトリップを参照してください。
Java データ型の XML 表現およびシリアライゼーション クラスを手動で作成する場合は、変換コードもすべて自分で記述するので、Java クラスを自在にコード化することができます。
servicegen または autotype Ant タスクを使用してデータ型のコンポーネントを自動的に生成させる場合は、そのデータ型の Java クラスを記述するときに、以下の要件に従います。
servicegen および autotype Ant タスクでは、ほとんどの一般的な XML および Java データ型のデータ型コンポーネントを生成できます。サポートされている非組み込みデータ型のリストは、servicegen および autotype Ant タスクでサポートされる非組み込みデータ型を参照してください。
WebLogic Web サービスを作成するときには、その Web サービスがドキュメント指向 (SOAP メッセージにドキュメントが格納される) または RPC 指向 (SOAP メッセージにパラメータと戻り値が格納される) のどちらであるのかを指定できます。
ドキュメント指向の Web サービスを作成する場合は、以下の点に注意してください。
wsdl2Service Ant タスクは既存の WSDL ファイルを入力とし、部分的に Web サービスを実装する Java ソース ファイルを生成します。
Java ソース ファイルには、Java クラスのみで実装される WebLogic Web サービスのテンプレートが格納されます。このテンプレートには、WSDL ファイルのオペレーションに対応する完全なメソッド シグネチャが含まれています。Java クラスを記述して Web サービスを実装するのガイドラインに従って、希望通りに機能するようにそれらのメソッドの実際のコードを記述します。
wsdl2Service Ant タスクは、(<service> 要素で指定された) WSDL ファイルの 1 つの Web サービスのみで部分的な実装を生成します。serviceName 属性を使用すると、特定のサービスを指定できます。この属性を指定しない場合、wsdl2Service Ant タスクでは WSDL ファイルの最初の <service> 要素の部分的な実装が生成されます。
wsdl2Service Ant タスクを実行するには、次の手順に従います。
prompt> ant
wsdl2Service Ant タスクのリファレンス情報については、wsdl2Serviceを参照してください。
wsdl2Service Ant タスクのサンプル build.xml ファイル
<project name="buildWebservice" default="generate-from-WSDL">
<target name="generate-from-WSDL">
<wsdl2service
wsdl="c:¥wsdls¥myService.wsdl"
destDir="c:¥myService¥implementation"
typeMappingFile="c:¥autotype¥types.xml"
packageName="example.ws2j.service" />
</target>
</project>
例の中の wsdl2Service Ant タスクでは、WSDL ファイル c:¥wsdls¥myService.wsdl の最初の <service> 要素の Java ソース ファイルが生成されます。非組み込みデータ型のデータ型マッピング情報は、c:¥autotype¥types.xml ファイルから利用します。このファイルは、通常は事前に autotype Ant タスクを実行して生成されています。生成された Java ソース ファイルは、パッケージ example.ws2j.service にあります。
WebLogic Web サービス オペレーションが返す値は一般的には 1 つで、その Web サービス オペレーションを実装する EJB メソッドまたは Java クラス メソッドの戻り値を返します。Web サービスのオペレーションで複数の値が返されるようにする場合は、以下のことができます。
out および inout パラメータは、オペレーションのパラメータがパラメータと戻り値の両方の標準として機能できるメカニズムです。out パラメータは、オペレーションの呼び出し時には未定義ですが、オペレーションの完了時にはそのオペレーションを実装するメソッドによって定義されます。inout パラメータは、呼び出し時および完了時に定義されます。たとえば、Web サービス オペレーションに out パラメータがあり、そのオペレーションは EJB メソッドを使用して実装されるとします。この EJB メソッドは、out パラメータの値を設定し、オペレーションを呼び出したクライアント アプリケーションにこの値を返します。すると、クライアントアプリケーションは、戻り値の場合と同様に、この out パラメータの値にアクセスすることができます。inout パラメータは、メソッドに情報を送信する標準の in パラメータと out パラメータの両方の機能を備えたパラメータです。この節では、out または inout パラメータを使用する EJB メソッドまたは Java クラス メソッドを使用して Web サービスを実装する方法について説明します。
次の例は、第 2 のパラメータとして inout パラメータを持つメソッドを示しています。
public String myMethod( String param1,
javax.xml.rpc.holders.IntHolder intHolder ) {
System.out.println ("The input value is: " + intHolder.value );
intHolder.value = 20; // out パラメータの新しい値
return param1;
}
このメソッドは、文字列と整数の 2 つのパラメータを使用して呼び出します。このメソッドは、文字列 (標準の戻り値) と整数 (IntHolder ホルダ パラメータを介して) という 2 つの値を返します。
out パラメータおよび inout パラメータは、javax.xml.rpc.holders.Holder インタフェースを実装する必要があります。Holder.value フィールドを使用して、まず、inout パラメータの入力値にアクセスし、次に、out および inout パラメータの値を設定します。先の例で、第 2 のパラメータに値 40 を指定してメソッドを呼び出したものとします。このメソッドの完了時には、intHolder 値は 20 となります。
out または inout パラメータが標準のデータ型である場合は、次の表に記載する JAX-RPC のホルダ クラスのいずれかを使用することができます。
パラメータのデータ型が用意されていない場合は、自分で実装を作成する必要があります。
自分で javax.xml.rpc.holders.Holder インタフェースの実装を作成するには、次のガイドラインに従います。
次の例は、PersonHolder 実装クラスの概略を示しています。
package examples.webservices.holders;
public final class PersonHolder implements
javax.xml.rpc.holders.Holder {
public Person value;
public PersonHolder() {
//value 変数をデフォルト値に設定
}
public PersonHolder (Person value) {
//value 変数を渡された値に設定
}
}
ステートレス セッション EJB または Java クラスで javax.xml.rpc.soap.SOAPFaultException 例外を送出すると、WebLogic Server は、その例外を SOAP 障害にマッピングし、そのオペレーションを呼び出すクライアント アプリケーションに送信します。
次の抜粋は、SOAPFaultException クラスを記述しています。
public class SOAPFaultException extends java.lang.RuntimeException {
public SOAPFaultException (QName faultcode,
String faultstring,
String faultactor,
javax.xml.soap.Detail detail ) {...}
public Qname getFaultCode() {...}
public String getFaultString() {...}
public String getFaultActor() {...}
public javax.xml.soap.Detail getDetail() {...}
}
EJB または Java クラスが他のタイプの Java 例外を送出する場合、WebLogic Server は、それをできるだけ SOAP 障害にマップしようとします。とはいえ、クライアント アプリケーションが最も有効な例外情報を受け取ることを保証するためには、SOAPFaultException 例外またはこの例外を拡張する例外を明示的に送出する必要があります。
weblogic.webservice.util.FaultUtil.newDetail() WebLogic Web サービスの API を使用して javax.xml.soap.Detail オブジェクトを作成してください。これは、アプリケーション固有の詳細なエラー情報を提供する、DetailEntry オブジェクトの JAX-RPC コンテナです。 javax.xml.soap.Detail.addDetailEntry() メソッドを使用すると、DetailEntry を Detail オブジェクトに追加できます。
以下は、Web サービスの実装内から SOAPFaultException を作成および送出する場合の例です。
throw new SOAPFaultException(
new QName( "http://schemas.xmlsoap.org/soap/envelope/", "Server" ),
"info on the fault",
"info on the actor",
weblogic.webservice.util.FaultUtil.newDetail() );
}
警告: (SOAPFaultException を使用せずに) 独自の例外を作成して送出する場合、例外クラスのプロパティの 2 つ以上が同じデータ型であれば、JAX-RPC 仕様では要求されていませんが、これらのプロパティのセッター メソッドも作成する必要があります。 これは、WebLogic Web サービスで SOAP メッセージ内の例外を受け取って XML を Java 例外クラスに変換する場合、対応するセッター メソッドがないと、どの XML 要素がどのクラス プロパティにマップするのかが分からないからです。
次の節では、WebLogic Web サービスがサポートする組み込みデータ型およびその XML 表現と Java 表現間のマッピングについて説明します。Web サービスを実装するバックエンド コンポーネントのパラメータと戻り値のデータ型が、組み込みデータ型のセットの中にある限り、データは WebLogic Server によって、XML と Java 間で自動的に変換されます。
一方、非組み込みデータ型を使用する場合は、データの XML、Java 間のデータ変換を行うシリアライゼーション クラスを作成する必要があります。WebLogic Server には、ほとんどの非組み込みデータ型のシリアライゼーション クラスを生成できる servicegen および autotype Ant タスクが用意されています。サポートされている XML および Java データ型のリストは、servicegen および autotype Ant タスクでサポートされる非組み込みデータ型を参照してください。servicegen および autotype の使い方の詳細については、Ant タスクを使用した WebLogic Web サービスのアセンブルを参照してください。
サポートされていないデータ型については、シリアライゼーション クラスを手動で作成する必要があります。詳細については、非組み込みデータ型の使用法を参照してください。
組み込みデータ型用の XML スキーマから Java へのマッピング
次の表に、XML スキーマ (ターゲット ネームスペース http://www.w3.org/2001/XMLSchema) が定義するすべての組み込みデータ型に対する定義済みマッピングと、対応する SOAP データ型 (ターゲット ネームスペース http://schemas.xmlsoap.org/soap/encoding/) を示します。
サポートされている非組み込み XML データ型のリストは、サポートされている XML 非組み込みデータ型を参照してください。
組み込みデータ型用の Javaから XML スキーマへのマッピング
サポートされている非組み込み Java データ型のリストは、サポートされている Java 非組み込みデータ型を参照してください。
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |