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

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

 Previous Next Contents PDF で侮ヲ  

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 サービスの実装 : 主な手順

以下は、WebLogic Web サービスを実装する高度な手順です。このマニュアルの後半で、この手順について詳細に説明します。実装する Web サービスのタイプにより、必須の手順もあれば省略可能なものもあります。

  1. Web サービスを構成するバックエンド コンポーネントの Java コードを記述します。

    コンポーネントの Java コードの記述を参照してください。

  2. SOAP の要求メッセージまたは応答メッセージにある情報を処理したり、SOAP の添付ファイルにアクセスしたりする必要がある場合は、SOAP メッセージ ハンドラおよびハンドラ チェーンを作成します。

    SOAP メッセージをインターセプトする SOAP メッセージ ハンドラの作成を参照してください。

  3. バックエンド コンポーネントが、パラメータまたは戻り値として非組み込みデータ型を使用する場合は、XML と Java 間のデータ変換を行うシリアライゼーション クラスを生成、または作成します。

    非組み込みデータ型を実装するを参照してください。

 


コンポーネントの Java コードの記述

WebLogic Web サービスを実装するときには、以下のいずれかのバックエンド コンポーネントの Java コードを記述します。

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 の記述と比べて特に相違はありません。

ステートレス セッション EJB の記述例については、EJB 用の Java コードの記述を参照してください。一般的な情報については、『WebLogic エンタープライズ JavaBeans プログラマーズ ガイド』を参照してください。

Java クラスを記述して Web サービスを実装する

以下の規則に従い、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 通りの方法があります。

Java データ型の XML 表現およびシリアライゼーション クラスを手動で作成する場合は、変換コードもすべて自分で記述するので、Java クラスを自在にコード化することができます。

servicegen または autotype Ant タスクを使用してデータ型のコンポーネントを自動的に生成させる場合は、そのデータ型の Java クラスを記述するときに、以下の要件に従います。

servicegen および autotype Ant タスクでは、ほとんどの一般的な XML および Java データ型のデータ型コンポーネントを生成できます。サポートされている非組み込みデータ型のリストは、servicegen および autotype Ant タスクでサポートされる非組み込みデータ型を参照してください。

ドキュメント指向の Web サービスの実装

WebLogic Web サービスを作成するときには、その Web サービスがドキュメント指向 (SOAP メッセージにドキュメントが格納される) または RPC 指向 (SOAP メッセージにパラメータと戻り値が格納される) のどちらであるのかを指定できます。

ドキュメント指向の Web サービスを作成する場合は、以下の点に注意してください。

WSDL ファイルに基づく部分的な実装の生成

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 タスクの実行

wsdl2Service Ant タスクを実行するには、次の手順に従います。

  1. wsdl2Service Ant タスクへの呼び出しの入った build.xml というファイルを作成します。詳細については、wsdl2Service Ant タスクのサンプル build.xml ファイルを参照してください。

  2. 環境を設定します。

    Windows NT では、setWLSEnv.cmd コマンドを実行します。WL_HOME¥server¥bin ディレクトリにあります。WL_HOME は WebLogic プラットフォームがインストールされている最上位ディレクトリです。

    UNIX では、setWLSEnv.sh コマンドを実行します。WL_HOME/server/bin ディレクトリにあります。WL_HOME は WebLogic プラットフォームがインストールされている最上位ディレクトリです。

  3. build.xml ファイルと同じディレクトリで ant と入力し、Ant タスクまたは build.xml ファイルで指定されたタスクを実行します。
    prompt> ant

wsdl2Service Ant タスクのリファレンス情報については、wsdl2Serviceを参照してください。

wsdl2Service Ant タスクのサンプル build.xml ファイル

以下は、簡単な 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 のホルダ クラスのいずれかを使用することができます。

表5-1 WebLogic Server で使用できる組み込みホルダ クラス

組み込みホルダ クラス

保持される Java データ型

javax.xml.rpc.holders.BooleanHolder

boolean

javax.xml.rpc.holders.ByteHolder

byte

javax.xml.rpc.holders.ShortHolder

short

javax.xml.rpc.holders.IntHolder

int

javax.xml.rpc.holders.LongHolder

long

javax.xml.rpc.holders.FloatHolder

float

javax.xml.rpc.holders.DoubleHolder

double

javax.xml.rpc.holders.BigDecimalHolder

java.math.BigDecimal

javax.xml.rpc.holders.BigIntegerHolder

java.math.BigInteger

javax.xml.rpc.holders.ByteArrayHolder

byte[]

javax.xml.rpc.holders.CalendarHolder

java.util.Calendar

javax.xml.rpc.holders.QnameHolder

javax.xml.namespace.QName

javax.xml.rpc.holders.StringHolder

java.lang.String


 

パラメータのデータ型が用意されていない場合は、自分で実装を作成する必要があります。

自分で 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 変数を渡された値に設定
}
}

SOAP 障害例外を送出する

ステートレス セッション 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() メソッドを使用すると、DetailEntryDetail オブジェクトに追加できます。

以下は、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 非組み込みデータ型を参照してください。

表5-2 組み込みデータ型用の XML スキーマから Java へのマッピング

XML スキーマ データ型

同等の Java データ型

(小文字はプリミティブ データ型を示す)

boolean

boolean

byte

byte

short

short

int

int

long

long

float

float

double

double

integer

java.math.BigInteger

decimal

java.math.BigDecimal

string

java.lang.String

dateTime

java.util.Calendar

base64Binary

byte[]

hexBinary

byte[]

duration

weblogic.xml.schema.binding.util.Duration

time

java.util.Calendar

date

java.util.Calendar

gYearMonth

java.util.Calendar

java.util.Calendar Javaデータ型には gYearMonth データ型より多くのフィールドがあります。この追加情報には意味はありません。実際の XML データから生成されたものではなく、データ バインド機能によって生成された情報です。

gYear

java.util.Calendar

java.util.Calendar Javaデータ型には gYearMonth データ型より多くのフィールドがあります。この追加情報には意味はありません。実際の XML データから生成されたものではなく、データ バインド機能によって生成された情報です。

gMonthDay

java.util.Calendar

java.util.Calendar Javaデータ型には gYearMonth データ型より多くのフィールドがあります。この追加情報には意味はありません。実際の XML データから生成されたものではなく、データ バインド機能によって生成された情報です。

gDay

java.util.Calendar

java.util.Calendar Javaデータ型には gYearMonth データ型より多くのフィールドがあります。この追加情報には意味はありません。実際の XML データから生成されたものではなく、データ バインド機能によって生成された情報です。

gMonth

java.util.Calendar

java.util.Calendar Javaデータ型には gYearMonth データ型より多くのフィールドがあります。この追加情報には意味はありません。実際の XML データから生成されたものではなく、データ バインド機能によって生成された情報です。

anyURI

java.lang.String

NOTATION

java.lang.String

token

java.lang.String

normalizedString

java.lang.String

language

java.lang.String

Name

java.lang.String

NMTOKEN

java.lang.String

NCName

java.lang.String

NMTOKENS

java.lang.String[]

ID

java.lang.String

IDREF

java.lang.String

ENTITY

java.lang.String

IDREFS

java.lang.String[]

ENTITIES

java.lang.String[]

nonPositiveInteger

java.math.BigInteger

nonNegativeInteger

java.math.BigInteger

negativeInteger

java.math.BigInteger

unsignedLong

java.math.BigInteger

positiveInteger

java.math.BigInteger

unsignedInt

long

unsignedShort

int

unsignedByte

short

Qname

javax.xml.namespace.QName


 

組み込みデータ型用の Javaから XML スキーマへのマッピング

サポートされている非組み込み Java データ型のリストは、サポートされている Java 非組み込みデータ型を参照してください。

表5-3 組み込みデータ型用の Javaから XML スキーマへのマッピング

Java データ型 (小文字はプリミティブ データ型を示す)

同等の XML データ型

int

int

short

short

long

long

float

float

double

double

byte

byte

boolean

boolean

char

string (with facet of length=1)

java.lang.Integer

int

java.lang.Short

short

java.lang.Long

long

java.lang.Float

float

java.lang.Double

double

java.lang.Byte

byte

java.lang.Boolean

boolean

java.lang.Character

string (with facet of length=1)

java.lang.String

string

java.math.BigInteger

integer

java.math.BigDecimal

decimal

java.lang.String

string

java.util.Calendar

dateTime

java.util.Date

dateTime

byte[]

base64Binary

weblogic.xml.schema.binding.util.Duration

duration

javax.xml.namespace.QName

Qname


 

 

Back to Top Previous Next