Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド 11g リリース1 (10.3.4) B61647-02 |
|
前 |
次 |
次の各項では、Webサービスを実装するJWSファイルのプログラミングについて説明します。
WebLogic Webサービスをゼロからプログラミングする方法は2つあります。
JSR-181、JAX-WS仕様、およびWebLogic Webサービス・プログラミング・モデルで規定されているように、標準のEJBまたはJavaクラスにWebサービスJavaアノテーションを付けます。
デプロイメント記述子、WSDLファイル、データ・マッピング記述子、データ・バインディング・アーティファクト(ユーザー定義のデータ型用)など、JSR-109で指定されている様々なXML記述子ファイルやアーティファクトと、標準のEJBまたはJavaクラスを結合します。
Oracleでは、上記のオプション1を実行することを強くお勧めします。ユーザー自身がXMLメタデータ記述子を作成しなくても、必要な記述子やアーティファクトはJWSにユーザーが含めたアノテーションに基づいてWebLogic Antタスクおよびランタイムによって生成されます。このプロセスの方がはるかに簡単なだけでなく、Webサービスの情報が多数のJavaファイルやXMLファイル内に分散されず、JWSファイルで集中管理されます。
アノテーション付きのJava Webサービス(JWS)ファイルは、Webサービスの中核部分です。このファイルにはWebサービスの動作を決定するJavaコードが含まれています。JWSファイルは、Javaメタデータ・アノテーションを使用してWebサービスの形式や特性を指定した、通常のJavaクラス・ファイルです。JWSファイルでは、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181
を参照)で定義される標準的なJWSアノテーションに加え、作成中のWebサービスの種類(JAX-WSまたはJAX-RPC)に基づいたその他のアノテーション・セットの使用が可能です。JAX-WS WebサービスおよびJAX-RPC Webサービスに対してサポートされているJWSアノテーションの完全なリストについては、『Oracle Fusion Middleware Oracle WebLogic Server WebLogic Webサービス・リファレンス』のWebサービスのアノテーションのサポートに関する項を参照してください。
JWSファイルをプログラミングする際は、基本的なWebサービス機能をプログラミングするためにアノテーションを含めます。アノテーションは、JWSファイル内の様々なレベル、様々なターゲットで使用されます。一部のアノテーションは、JWSファイル全体に適用されることを示すためにクラス・レベルで使用されます。それ以外のアノテーションには、メソッド・レベルで使用するものや、パラメータ・レベルで使用するものがあります。
JWSファイルをプログラミングする場合は、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181
)で指定された一連の要件に従う必要があります。特に、Webサービスを実装するJavaクラスは、次の要件に従う必要があります。
パブリック・クラスでなければなりません。final
クラスやabstract
クラスとして宣言することはできません。
デフォルトのパブリック・コンストラクタを持つ必要があります。
finalize()
メソッドは定義できません。
少なくとも、クラス・レベルで@WebService
JWSアノテーションを指定して、そのJWSファイルがWebサービスを実装することを指定する必要があります。
@WebService.endpointInterface
アノテーションを使用して、サービス・エンド・ポイント・インタフェースを参照できます。この場合は、サービス・エンド・ポイント・インタフェースが存在することを前提としています。JWSファイルでは@WebService.endpointInterface
、@WebService.serviceName
、および@WebService.targetNamespace
以外のJWSアノテーションを指定することはできません。
JWSファイルにサービス・エンド・ポイント・インタフェースが実装されていない場合は、java.lang.Object
から継承されたもの以外のすべてのパブリック・メソッドがWebサービス・オペレーションとして公開されます。この動作は、@WebMethod
アノテーションを使用して、公開するパブリック・メソッドを明示的に指定することによって、オーバーライドできます。@WebMethod
アノテーションが存在する場合は、それが適用されるメソッドのみが公開されます。
次の手順では、Webサービスを実装するJWSファイルをプログラミングするための一般的な手順を説明します。
注意: JWSファイルを作成してあり、そこにJWSアノテーションを追加する予定であることを前提としています。 |
各JWSアノテーションの詳細は、『Oracle Fusion Middleware Oracle WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスの項を参照してください。他のJWSアノテーションを使用して、より高度な機能(Webサービスの信頼性のあるメッセージング、会話、SOAPメッセージ・ハンドラなど)をプログラミングする方法については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング』を参照してください。
表4-1 JWSファイルのプログラミング手順
# |
手順 | 説明 |
---|---|---|
1 |
JWSファイルで使用する標準のJWSアノテーションをインポートします。 |
標準のJWSアノテーションは import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; |
2 |
JWSファイルで使用するWebLogic固有のアノテーションをインポートします。 |
WebLogic固有のアノテーションは import weblogic.jws.WLHttpTransport; |
3 |
必須の標準 |
|
4 |
標準の |
特に、このアノテーションを使用して、Webサービスがドキュメント・リテラルか、RPCエンコードかなどを指定します。「WebサービスとSOAPメッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)」を参照してください。 このJWSアノテーションは必須ではありませんが、JWSファイルで明示的に指定し、クライアント・アプリケーションがWebサービスの呼出しに使用するSOAPバインディングのタイプを明確にすることをお薦めします。 |
5 |
WebLogic固有の |
「Webサービスのコンテキスト・パスとサービスURIの指定(@WLHttpTransportアノテーション)」を参照してください。 このJWSアノテーションは必須ではありませんが、JWSファイルで明示的に指定し、クライアント・アプリケーションがWebサービスの呼出しに使用するURLを明確にすることをお薦めします。 |
6 |
パブリック・オペレーションとして公開するJWSファイルの各メソッドで標準の |
必要に応じて、標準の |
7 |
|
「オペレーションのパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)」を参照してください。 |
8 |
|
「オペレーションの戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)」を参照してください。 |
9 |
独自のビジネス・コードを追加します。 |
Webサービスが希望どおりに動作するように、独自のビジネス・コードをメソッドに追加します。 |
次のサンプルJWSファイルでは、簡単なWebサービスの実装方法を示します。
package examples.webservices.simple; // Import the standard JWS annotation interfaces import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; // Import the WebLogic-specific JWS annotation interfaces import weblogic.jws.WLHttpTransport; // Standard JWS annotation that specifies that the porType name of the Web // Service is "SimplePortType", the service name is "SimpleService", and the // targetNamespace used in the generated WSDL is "http://example.org" @WebService(name="SimplePortType", serviceName="SimpleService", targetNamespace="http://example.org") // Standard JWS annotation that specifies the mapping of the service onto the // SOAP message protocol. In particular, it specifies that the SOAP messages // are document-literal-wrapped. @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) // WebLogic-specific JWS annotation that specifies the context path and // service URI used to build the URI of the Web Service is // "simple/SimpleService" @WLHttpTransport(contextPath="simple", serviceUri="SimpleService", portName="SimpleServicePort") /** * This JWS file forms the basis of simple Java-class implemented WebLogic * Web Service with a single operation: sayHello * */ public class SimpleImpl { // Standard JWS annotation that specifies that the method should be exposed // as a public operation. Because the annotation does not include the // member-value "operationName", the public name of the operation is the // same as the method name: sayHello. @WebMethod() public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
次のコードの抜粋のように、標準の@WebService
アノテーションを使用して、JWSファイルがWebサービスを実装することをクラス・レベルで指定します。
@WebService(name="SimplePortType", serviceName="SimpleService", targetNamespace="http://example.org")
この例では、Webサービスの名前はSimplePortType
であり、jwsc
Antタスクによって生成されるWSDLファイルのwsdl:portType
要素に後でマップされます。サービス名はSimpleService
であり、生成されるWSDLファイルのwsdl:service
要素にマップされます。生成されるWSDLで使用されるターゲット・ネームスペースはhttp://example.org
です。
@WebService
アノテーションの以下の追加の属性を指定することもできます。
endpointInterface
- 既存のサービス・エンド・ポイント・インタフェース・ファイルの完全修飾名。このアノテーションによって、実装からインタフェース定義を切り離すことができます。この属性を指定した場合、jwsc
Antタスクはそのインタフェースを生成しません。そのインタフェースは作成されていて、CLASSPATHに入っていると想定します。
portname
- wsdl:port
内で使用される名前。
@WebService
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform(JSR 181)(http://www.jcp.org/en/jsr/detail?id=181
)を参照してください。
ここでは、WebサービスをSOAPメッセージ・プロトコルで使用できるようにします。そのためには、JWSファイル内にクラス・レベルで標準の@SOAPBinding
アノテーションを含めて、WebサービスのSOAPバインディング(RPCエンコードまたはdocument-literal-wrappedなど)を指定します(次のコードの抜粋を参照)。
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
この例で、Webサービスはdocument-wrapped-styleエンコーディングとリテラル・メッセージ・フォーマットを使用していますが、@SOAPBinding
アノテーションを使用しない場合でも、これらはデフォルトのフォーマットとなります。
WebLogic固有の@weblogic.jws.soap.SOAPBinding
アノテーションを使用して、メソッド・レベルのSOAPバインディングを指定することもできます。属性は、標準の@javax.jws.soap.SOAPBinding
アノテーションと同じです。
parameterStyle
属性を(style=SOAPBinding.Style.DOCUMENT
属性と一緒に)使用して、Webサービス・オペレーションのパラメータがSOAPメッセージ本文全体を表すかどうか、またはオペレーションと同じ名前の最上位要素内にラップされる要素かどうかを指定します。
表4-2 @SOAPBindingアノテーションの属性
属性 | 指定できる値 | デフォルト値 |
---|---|---|
|
|
|
|
|
|
|
|
|
WebLogic固有の@WLHttpTransport
アノテーションを使用して、HTTPトランスポートでWebサービスを呼び出すために使用するURLのコンテキスト・パスとサービスURIの部分、および生成されるWSDL内のポート名を指定します(次のコードの抜粋を参照)。
@WLHttpTransport(contextPath="simple", serviceUri="SimpleService", portName="SimpleServicePort")
この例では、jwsc
Antタスクによって生成されるWSDLファイル内のポート名(具体的には<port>
要素のname
属性)はSimpleServicePort
です。HTTPを介してWebサービスを呼び出すために使用するURLには、次の例のように、simple
というコンテキスト・パスとSimpleService
というサービスURIが含まれます。
http://host:port/simple/SimpleService
このアノテーションやその他のWebLogic固有のアノテーションに関するリファレンス・ドキュメントについては、『WebLogic Webサービス・リファレンス』の「JWSアノテーション・リファレンス」を参照してください。
標準の@WebMethod
アノテーションを使用して、JWSファイルのメソッドをWebサービスのパブリック・オペレーションとして公開することを指定します(次のコードの抜粋を参照)。
public class SimpleImpl { @WebMethod(operationName="sayHelloOperation") public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } ...
この例では、SimpleImpl
JWSファイルのsayHello()
メソッドがWebサービスのパブリック・オペレーションとして公開されます。ただし、operationName
属性では、WSDLファイル内のオペレーションのパブリック名はsayHelloOperation
になることを指定しています。operationName
属性を指定しない場合は、メソッドの名前がオペレーションのパブリック名になります。
action
属性を使用してオペレーションのアクションを指定することもできます。SOAPをバインディングとして使用する場合、action
属性の値によって、SOAPメッセージ内のSOAPAction
ヘッダーの値が決まります。
標準の@Oneway
アノテーションを使用して、オペレーションが呼出し側アプリケーションに値を返さないことを指定できます。次の例を参照してください。
public class OneWayImpl { @WebMethod() @Oneway() public void ping() { System.out.println("ping operation"); } ...
オペレーションが一方向であることを指定する場合、実装するメソッドはvoid
を返す必要があります。パラメータとしてホルダー・クラスを使用したり、チェック済み例外をスローしたりすることはできません。
@WebMethod
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値と@WebMethod
および@Oneway
アノテーションの詳細は、Web Services Metadata for the Java Platform(JSR 181)(http://www.jcp.org/en/jsr/detail?id=181
)を参照してください。
JWSファイル内のどのパブリック・メソッドにも@WebMethod
アノテーションを付けていない場合、デフォルトではすべてのパブリック・メソッドがWebサービス・オペレーションとして公開されます。
標準の@WebParam
アノテーションを使用して、Webサービス・オペレーションの入力パラメータと生成されるWSDLファイルの要素との間のマッピングをカスタマイズしたり、パラメータの動作を指定したりします(次のコードの抜粋を参照)。
public class SimpleImpl { @WebMethod() @WebResult(name="IntegerOutput", targetNamespace="http://example.org/docLiteralBare") public int echoInt( @WebParam(name="IntegerInput", targetNamespace="http://example.org/docLiteralBare") int input) { System.out.println("echoInt '" + input + "' to you too!"); return input; } ...
この例では、生成されるWSDLファイル内のechoInt
オペレーションのパラメータ名はIntegerInput
になります。JWSファイルに@WebParam
アノテーションがない場合、生成されるWSDLファイル内のパラメータ名は、メソッドのパラメータ名input
と同じになります。targetNamespace
属性は、パラメータのXMLネームスペースがhttp://example.org/docLiteralBare
であることを指定します。この属性は、パラメータとXML要素がマップされる、ドキュメント・スタイルのSOAPバインディングを使用する場合にのみ有効です。
@WebParam
アノテーションの以下の追加の属性を指定することもできます。
mode
- パラメータの入出力の方向(WebParam.Mode.IN
、WebParam.Mode.OUT
、またはWebParam.Mode.INOUT
)。OUTおよびINOUTモードは、Holder
型のJAX-RPC定義に準拠するパラメータ型に対してのみ指定できます。OUTおよびINOUTモードは、RPC形式のオペレーション、またはヘッダーにマップされるパラメータでのみサポートされます。
header
- true
に設定した場合、パラメータの値はデフォルトの本文からではなくSOAPヘッダーから取得されることを指定する、ブール型の属性。
@WebParam
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181
)を参照してください。
標準の@WebResult
アノテーションを使用して、Webサービス・オペレーションの戻り値と生成されるWSDLファイル内の対応する要素との間のマッピングをカスタマイズします(次のコードの抜粋を参照)。
public class Simple { @WebMethod() @WebResult(name="IntegerOutput", targetNamespace="http://example.org/docLiteralBare") public int echoInt( @WebParam(name="IntegerInput", targetNamespace="http://example.org/docLiteralBare") int input) { System.out.println("echoInt '" + input + "' to you too!"); return input; } ...
この例では、生成されるWSDLファイル内のechoInt
オペレーションの戻り値の名前はIntegerOutput
になります。JWSファイルに@WebResult
アノテーションがない場合、生成されるWSDLファイル内の戻り値の名前は、ハード・コード化された名前return
になります。targetNamespace
属性は、戻り値のXMLネームスペースがhttp://example.org/docLiteralBare
であることを指定します。この属性は、戻り値とXML要素がマップされる、ドキュメント・スタイルのSOAPバインディングを使用する場合にのみ有効です。
@WebResult
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、Web Services Metadata for the Java Platform (JSR 181)仕様(http://www.jcp.org/en/jsr/detail?id=181
)を参照してください。
次の各項では、Webサービスの実行時情報へのアクセス方法について説明します。
JwsContextを使用した実行時情報へのアクセス: Webサービス・コンテキストを使用して、JWSファイル内のサービスの実行時情報にアクセスし、その情報を変更します。
Stubインタフェースを使用した実行時情報へのアクセス: クライアント・ファイル内のStubインタフェース上のプロパティを取得および設定します。
JWSファイルを実装したWebLogic Webサービスをクライアント・アプリケーションが呼び出すと、WebLogic Serverでコンテキストが自動的に作成され、Webサービスはこのコンテキストを使用してサービスに関する実行時情報にアクセスし、場合によっては変更することもできます。この情報の大半は、現在の会話が終了したかどうか、現在の会話のプロパティ値、実行時の会話のプロパティの変更など、会話に関連しています。(会話の詳細および実装方法については、『Oracle Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービスの高度な機能のプログラミング』の「会話形式のWebサービスの作成」を参照してください。)コンテキストを介してアクセス可能な情報の一部は、Webサービスの呼出しに使用されたプロトコル(HTTP/SまたはJMS)、SOAPメッセージ要求内にあったSOAPヘッダーなど、より一般的な情報で構成されています。
次の項で説明するように、JWSファイル内のアノテーションおよびWebLogic WebサービスAPIを使用して、実行時のコンテキスト情報にアクセスできます。
コンテキストを使用して、Webサービスの呼出しに使用されていたプロトコルを特定する簡単なサンプルJWSファイルを次に示します。太字のコードについては、例の後のプログラミングのガイドラインで説明しています。
package examples.webservices.jws_context; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.jws.Context; import weblogic.wsee.jws.JwsContext; import weblogic.wsee.jws.Protocol; @WebService(name="JwsContextPortType", serviceName="JwsContextService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="contexts", serviceUri="JwsContext", portName="JwsContextPort") /** * Simple web service to show how to use the @Context annotation. */ public class JwsContextImpl { @Context private JwsContext ctx; @WebMethod() public String getProtocol() { Protocol protocol = ctx.getProtocol(); System.out.println("protocol: " + protocol); return "This is the protocol: " + protocol; } }
JWSファイルで、次のガイドライン(上記の例の太字で示されたコード)を使用して、Webサービスの実行時コンテキストにアクセスします。
@weblogic.jws.Context
JWSアノテーションをインポートします。
import weblogic.jws.Context;
weblogic.wsee.jws.JwsContext
APIと、使用する他の関連API (例ではweblogic.wsee.jws.Protocol
APIも使用)をインポートします。
import weblogic.wsee.jws.JwsContext; import weblogic.wsee.jws.Protocol;
コンテキスト関連のAPIに関するドキュメントについては、『Oracle Fusion Middleware Oracle WebLogic Server APIリファレンス』の「weblogic.wsee.*
パッケージ」を参照してください。
データ型weblogic.wsee.jws.JwsContext
のプライベート変数に、フィールド・レベルの@Context
JWSアノテーションを指定します。
@Context private JwsContext ctx;
WebLogic Serverでは、Webサービスの初回の呼出しの際に、実行時にJwsContext
の実装を指定するアノテーションを付加された変数(この場合はctx
)が自動的に割り当てられます。これにより、この変数を後で使用する場合、コード内で明示的に初期化する必要がありません。
JwsContext
クラスのメソッドを使用して、Webサービスの実行時情報にアクセスします。次の例では、Webサービスの呼出しに使用されたプロトコルを取得する方法を示します。
Protocol protocol = ctx.getProtocol();
使用できるメソッドの詳細なリストについては、「JwsContextのメソッド」を参照してください。
次の表に、JWSファイル内でWebサービスの実行時情報にアクセスするために使用可能なJwsContext
のメソッドの説明を示します。JwsContext
およびその他のコンテキスト関連API(Protocol
やServiceHandle
など)の詳細なリファレンス情報については、Oracle Fusion Middleware Oracle WebLogic Server APIリファレンスのweblogic.wsee.*
パッケージに関する項を参照してください。
表4-3 JwsContextのメソッド
メソッド | 戻り値 | 説明 |
---|---|---|
isFinished() |
boolean |
現在の会話が終了しているか、またはまだ続いているかを示すブール値を返します。 このメソッドは、会話形式のWebサービス、つまり、 |
finishConversation() |
void |
現在の会話を終了します。 このメソッドは、 このメソッドは、会話形式のWebサービス、つまり、 |
setMaxAge(java.util.Date) |
void |
会話の新しい最大存続期間を絶対日付の このメソッドは、会話のデフォルトの最大存続期間を指定する、 このメソッドは、会話形式のWebサービス、つまり、 |
setMaxAge(String) |
void |
たとえば、最大存続期間を10分に設定するには、次の構文を使用します。
このメソッドは、会話のデフォルトの最大存続期間を指定する、 このメソッドは、会話形式のWebサービス、つまり、 |
getMaxAge() |
long |
許容される会話の最大存続期間を秒単位で返します。 このメソッドは、会話形式のWebサービス、つまり、 |
getCurrentAge() |
long |
会話の現在の存続期間を秒単位で返します。 このメソッドは、会話形式のWebサービス、つまり、 |
resetIdleTime() |
void |
現在の会話の最後のアクティビティ以降の秒数を測定するタイマーをリセットします。 このメソッドは、会話形式のWebサービス、つまり、 |
setMaxIdleTime(long) |
void |
クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数を設定します。 このメソッドは、会話のデフォルトのアイドル時間を指定する、 このメソッドは、会話形式のWebサービス、つまり、 |
setMaxIdleTime(String) |
void |
クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数を
たとえば、最大アイドル時間を10分に設定するには、次の構文を使用します。
このメソッドは、会話のデフォルトのアイドル時間を指定する、 このメソッドは、会話形式のWebサービス、つまり、 |
getMaxIdleTime() |
long |
クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数を返します。 このメソッドは、会話形式のWebサービス、つまり、 |
getCurrentIdleTime() |
long |
最後のクライアント・リクエスト以降の秒数、または、会話の最大アイドル時間のリセット以降の秒数を取得します。 このメソッドは、会話形式のWebサービス、つまり、 |
getCallerPrincipal() |
java.security.Principal |
基本認証が実行されたと想定し、呼び出されたばかりのオペレーションに関連付けられたセキュリティ・プリンシパルを返します。 |
isCallerInRole(String) |
boolean |
認証されるプリンシパルが指定されたセキュリティ・ロールに属している場合は |
getService() |
weblogic.wsee.jws.ServiceHandle |
WebLogic WebサービスAPIの |
getLogger(String) |
weblogic.wsee.jws.util.Logger |
|
getInputHeaders() |
org.w3c.dom.Element[] |
現在のオペレーション呼出しのSOAPリクエスト・メッセージに関連付けられたSOAPヘッダーの配列を返します。 |
setUnderstoodInputHeaders(boolean) |
void |
入力ヘッダーを解釈するかどうかを示します。 |
getUnderstoodInputHeaders() |
boolean |
setUnderstoodInputHeaderの呼出しによって設定された最新の値を返します。 |
setOutputHeaders(Element[]) |
void |
現在のオペレーションを最初に呼び出したクライアント・アプリケーションに返送されるSOAPレスポンス・メッセージに関連付ける、SOAPヘッダーの配列を指定します。 |
getProtocol() |
weblogic.wsee.jws.Protocol |
現在のオペレーションを呼び出すのに使用されるプロトコル(HTTP/SやJMSなど)を返します。 |
javax.xml.rpc.Stub
インタフェースを使用すると、Webサービス・クライアント・ファイル内でStubインスタンスを動的に構成できます。詳細は、http://java.sun.com/javaee/5/docs/api/javax/xml/rpc/Stub.html
を参照してください。たとえば、次に示すようにport
Stubインスタンスに対してターゲット・サービス・エンド・ポイントを動的に設定できます。
ComplexService service = new ComplexService_Impl (args[0] + "?WSDL" ); ComplexPortType port = service.getComplexServicePort(); ((Stub)port)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8010/MyContext/MyService");
Webサービス・クライアントの開発の詳細は、第6章「Webサービスの呼出し」を参照してください。
次の表に、JWSファイル内でWebサービスの実行時情報にアクセスするために使用できるStub
インタフェースのメソッドの説明を示します。
表4-4 Stubインタフェースのメソッド
メソッド | 戻り値 | 説明 |
---|---|---|
_getProperty() |
java.lang.Object |
特定の構成プロパティの値を取得します。 |
_getPropertyNames() |
java.util.Iterator |
|
_setProperty() |
void |
|
以下の表では、Stubインスタンスからアクセスできるjavax.xml.rpc.Stub
プロパティ値を定義します。
jwsc
Antタスクでは、JWSファイルを処理するときは常に、Webサービスの基底の実装としてプレーンJavaオブジェクトが選択されます。
しかし、Webサービスの基底の実装をステートレス・セッションEJBにして、EJBが提供するすべての機能(インスタンス・プール、トランザクション、セキュリティ、コンテナ管理による永続性、コンテナ管理による関係、データ・キャッシュなど)を活用することが必要な場合もあります。Webサービスの実装をEJBにする場合は、次の項のプログラミング・ガイドラインに従ってください。
注意: JAX-RPCはEJB 2.xのみをサポートし、EJB 3.0をサポートしません。 |
一般的なガイドラインは、JWSファイルで常にEJBGenアノテーションを使用して、EJBを実装する場合に必要なEJBリモートおよびホーム・インタフェース・クラスおよびデプロイメント記述子ファイルを、手動で作成するのではなく、自動的に生成することです。EJBGenアノテーションはJWSアノテーションと同じように動作します。JDK 5.0メタデータ構文に従い、プログラミング・タスクを大幅に簡素化します。
EJBGenの詳細は、『Oracle Fusion Middleware Oracle WebLogic Server WebLogic Enterprise JavaBeans (EJB)プログラマーズ・ガイド』の「EJBGenリファレンス」を参照してください。
JWSファイルでステートレス・セッションEJBを明示的に実装する場合は、以下のガイドラインに従います。例については「EJBを実装するJWSファイルの例」を参照してください。該当する部分は太字で示されています。
標準的なJava Platform, Enterprise Edition (Java EE)バージョン5のEJBクラスをインポートします。
import javax.ejb.SessionBean; import javax.ejb.SessionContext;
EJBGenアノテーションをインポートします。EJBGenアノテーションはすべてweblogic.ejbgen
パッケージにあります。少なくとも、@Session
アノテーションをインポートする必要があります。EJBの形式や動作を指定するためにJWSファイルで追加のEJBGenアノテーションを使用する場合は、『Oracle Fusion Middleware Oracle WebLogic Server WebLogic Enterprise JavaBeans (EJB)プログラマーズ・ガイド』の「EJBGenリファレンス」を参照し、インポートすべきアノテーションの名前を確認してください。
import weblogic.ejbgen.Session;
少なくとも、@Session
アノテーションをクラス・レベルで使用して、EJBの名前を指定します。
@Session(ejbName="TransactionEJB")
JWSファイルで使用する場合、必須のEJBGenアノテーションは@Session
のみです。必要な場合は、他のEJBGenアノテーションを使用して、EJBの追加機能を指定します。
JWSクラスで必ずSessionBean
を実装します。
public class TransactionImpl implements SessionBean {...
標準のEJBメソッドejbCreate()
、ejbActivate()
なども含める必要があります。ただし、通常は、EJBのデフォルトの動作を変更するのでない限り、これらのメソッドにコードを追加する必要はありません。
public void ejbCreate() {} public void ejbActivate() {} public void ejbRemove() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {}
JWSファイルでこれらのガイドラインにすべて従うと、jwsc
AntタスクはWebサービスをEJBにコンパイルして、それをエンタープライズ・アプリケーション内部のEJB JARファイルにパッケージ化します。
以下の例では、ステートレス・セッションEJBを実装する簡単なJWSファイルを示します。関連するコードは太字で示されています。
package examples.webservices.transactional; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.jws.Transactional; import weblogic.ejbgen.Session; @Session(ejbName="TransactionEJB") @WebService(name="TransactionPortType", serviceName="TransactionService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="transactions", serviceUri="TransactionService", portName="TransactionPort") /** * This JWS file forms the basis of simple EJB-implemented WebLogic * Web Service with a single operation: sayHello. The operation executes * as part of a transaction. * */ public class TransactionImpl implements SessionBean { @WebMethod() @Transactional(value=true) public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } // Standard EJB methods. Typically there's no need to override the methods. public void ejbCreate() {} public void ejbActivate() {} public void ejbRemove() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} }
Webサービス・オペレーションとして公開されるJWSファイルのメソッドでは、パラメータや戻り値として必ずしも組込みのデータ型(Stringやintegerなど)を取る必要はなく、独自に作成するJavaデータ型を使用できます。ユーザー定義のデータ型の例としては、String
の銘柄記号とintegerの売買株式数という2つのフィールドを持つTradeResult
があげられます。
JWSファイルで、1つまたは複数のメソッドのパラメータまたは戻り値としてユーザー定義のデータ型を使用する場合は、データ型のJavaコードを独自に作成して、JWSファイルにそのクラスをインポートし、適切に使用する必要があります。jwsc
Antタスクは、Javaユーザー定義データ型の対応するXMLスキーマ表現、JAX-RPCの型マッピング・ファイルなど、必要なデータ・バインディング・アーティファクトをすべて作成します。
ユーザー定義のデータ型のJavaコードを記述するときは、以下の基本的な要件に従います。
デフォルト・コンストラクタを定義します。これは、パラメータを取らないコンストラクタです。
公開するメンバー変数ごとにgetXXX()
メソッドとsetXXX()
メソッドの両方を定義します。
公開される各メンバー変数のデータ型は、組込みデータ型のいずれか、または組込みデータ型で構成されるユーザー定義のデータ型にします。
これらの要件はJAX-RPCで指定されています。要件の詳細と完全なリストについては、https://jax-rpc.dev.java.net
にあるJAX-RPC仕様を参照してください。
jwsc
Antタスクでは、最も一般的なXMLおよびJavaデータ型のデータ・バインディング・アーティファクトを生成できます。サポートされるユーザー定義のデータ型のリストについては、「サポートされるユーザー定義のデータ型」を参照し、サポートされる組込みデータ型の全リストについては、「サポートされる組込みデータ型」を参照してください。
以下の例では、BasicStruct
という簡単なJavaユーザー定義データ型を示します。
package examples.webservices.complex; /** * Defines a simple JavaBean called BasicStruct that has integer, String, * and String[] properties */ public class BasicStruct { // Properties private int intValue; private String stringValue; private String[] stringArray; // Getter and setter methods public int getIntValue() { return intValue; } public void setIntValue(int intValue) { this.intValue = intValue; } public String getStringValue() { return stringValue; } public void setStringValue(String stringValue) { this.stringValue = stringValue; } public String[] getStringArray() { return stringArray; } public void setStringArray(String[] stringArray) { this.stringArray = stringArray; } }
以下のJWSファイルの抜粋では、BasicStruct
クラスをインポートして、1つのメソッドのパラメータおよび戻り値として使用する方法を示しています。完全なJWSファイルについては、「サンプルComplexImpl.java JWSファイル」を参照してください。
package examples.webservices.complex; // Import the standard JWS annotation interfaces import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; // Import the WebLogic-specific JWS annotation interface import weblogic.jws.WLHttpTransport; // Import the BasicStruct JavaBean import examples.webservices.complex.BasicStruct; @WebService(serviceName="ComplexService", name="ComplexPortType", targetNamespace="http://example.org") ... public class ComplexImpl { @WebMethod(operationName="echoComplexType") public BasicStruct echoStruct(BasicStruct struct) { return struct; } }
JWSファイルのメソッド内にエラー処理のJavaコードを記述する場合は、独自のユーザー定義の例外をスローすることも、javax.xml.rpc.soap.SOAPFaultException
例外をスローすることもできます。SOAPFaultException
をスローする場合、WebLogic Serverは例外をSOAPエラーにマップして、オペレーションを呼び出すクライアント・アプリケーションに送信します。
JWSファイルがSOAPFaultException
以外のJava例外をスローした場合、WebLogic Serverはその例外をできる限りSOAPエラーにマップしようとします。ただし、クライアント・アプリケーションが受け取る例外を制御して、最適な例外情報を送るには、SOAPFaultException
またはSOAPFaultExceptionを拡張した例外を明示的にスローする必要があります。ユーザー定義の例外の作成とスローの詳細は、https://jax-rpc.dev.java.net
にあるJAX-RPC仕様を参照してください。
次の抜粋では、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() {...} }
SOAP with Attachments API for Java 1.1 (SAAJ)のjavax.xml.soap.SOAPFactory.createDetail()
メソッドを使用して、Detail
オブジェクトを作成します。このオブジェクトは、エラーに関するアプリケーション固有の詳細情報を提供するDetailEntry
オブジェクトのコンテナになります。
独自のSOAPFactory
の実装またはOracleのものを使用できます。これらにアクセスするには、JWSファイル内で静的メソッドweblogic.wsee.util.WLSOAPFactory.createSOAPFactory()
を呼び出します。このメソッドはjavax.xml.soap.SOAPFactory
オブジェクトを返します。実行時には、次に示すように、-Djavax.xml.soap.SOAPFactory
フラグを使用して、OracleのSOAPFactory
実装を指定します。
-Djavax.xml.soap.SOAPFactory=weblogic.xml.saaj.SOAPFactoryImpl
次のJWSファイルは、Webサービスのオペレーションを実装するメソッド内からSOAPFaultException
を作成してスローする例を示しています。太字の部分は例外コードを表しています。
package examples.webservices.soap_exceptions; import javax.xml.namespace.QName; import javax.xml.soap.Detail; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFactory; import javax.xml.rpc.soap.SOAPFaultException; // Import the @WebService annotation import javax.jws.WebService; // Import WLHttpTransport import weblogic.jws.WLHttpTransport; @WebService(serviceName="SoapExceptionsService", name="SoapExceptionsPortType", targetNamespace="http://example.org") @WLHttpTransport(contextPath="exceptions", serviceUri="SoapExceptionsService", portName="SoapExceptionsServicePort") /** * This JWS file forms the basis of simple Java-class implemented WebLogic * Web Service with a single operation: sayHelloWorld * */ public class SoapExceptionsImpl { public SoapExceptionsImpl() { } public void tirarSOAPException() { Detail detail = null; try { SOAPFactory soapFactory = SOAPFactory.newInstance(); detail = soapFactory.createDetail(); } catch (SOAPException e) { // do something } QName faultCode = null; String faultString = "the fault string"; String faultActor = "the fault actor"; throw new SOAPFaultException(faultCode, faultString, faultActor, detail); } }
この例では、SOAPFactory
のデフォルトの実装を使用しています。
注意: SOAPFaultException を使用せずに独自の例外を作成およびスローする場合に、例外クラスの複数のプロパティのデータ型が同じであるときは、これらのプロパティのセッター・メソッドも作成する必要があります(JAX-RPC仕様で規定されているわけではありません)。これは、WebLogic WebサービスがSOAPメッセージで例外を受け取り、XMLをJava例外クラスに変換するときに、対応するセッター・メソッドがなければ、どのXML要素をどのクラス・プロパティにマップするのかを知る方法がないからです。 |
JWSファイル内から別のWebサービス(WebLogic ServerにデプロイされているWebサービス、または.NETなどの他のアプリケーション・サーバーにデプロイされているWebサービス)を呼び出すことができます。その手順は、「Java SEクライアントからのWebサービスの呼出し」で説明した手順と似ています。ただしこの場合は、clientgen
Antタスクを実行してクライアント・スタブを生成するのではなく、呼出し側のWebサービスを構築するjwsc
Antタスクの<clientgen>
子要素をインクルードしてクライアント・スタブを生成します。その後、JWSファイル内で標準のJAX-RPC APIを使用します。
詳細な手順については、「別のWebサービスからのWebサービスの呼出し」を参照してください。
次の各項では、JWSファイル内で特定のJWSアノテーションを指定するか、WebLogic WebサービスAPIを使用してプログラミングできるその他の機能について説明します。
SOAP Message Transmission Optimization Mechanism/XML-binary Optimized Packaging (MTOM/XOP)では、SOAPメッセージ内のxs:base64Binary
型のXMLデータの送信を最適化する方法が説明されています。トランスポート・プロトコルがHTTPの場合、MIME添付ファイルを使用して、送信側と受信側の両方に対して同時にSOAPメッセージ内のXMLデータへの直接アクセスを許可する間にデータを伝達します。このとき、xs:base64Binary
データのマーシャリングにMIMEアーティファクトが使用されていたことを意識する必要はありません。バイナリ・データの最適化プロセスでは、バイナリ・データのエンコード、SOAPエンベロープからの削除、圧縮およびMIMEパッケージへの添付、SOAPエンベロープでのそのパッケージへのリファレンスの追加を行います。
MTOM仕様では、MTOMが有効な場合、base64binary
データを転送する際にWebサービス・ランタイムでXOPバイナリ最適化を使用する必要がありません。MTOM仕様では、ランタイムでこれを選択できるとしています。それは、base64binary
データを直接にSOAPメッセージで送信する方が効率的であるとランタイムで判断される場合があるからです。このようなケースには、たとえば、転送するデータ量が少なく、データをそのままの状態でインライン処理するよりも、変換および転送のオーバーヘッドによってリソースの消費量が増加する場合です。ただし、WebLogic WebサービスのJAX-RPCサービスでのMTOMの実装では、MTOMが有効な場合、常にMTOM/XOPが使用されます。
WebLogic JAX-RPC WebサービスでのMTOM/XOPのサポートは、あらかじめパッケージ化されたWS-PolicyファイルMtom.xml
を使用して実装されます。WS-Policyファイルは、WS-Policy仕様(http://www.w3.org/TR/ws-policy
を参照)に準拠しています。この仕様では、Webサービスのポリシー(この場合は、バイナリ・データ送信のためのMTOM/XOPの使用)を記述および伝達する汎用モデルおよびXML構文を提供しています。WebサービスのWSDLのtypes
セクションに、あらかじめパッケージ化されたMtom.xml
WS-Policyファイルを組み込む場合は、次のようになります(参考のためにのみ掲載しています。このファイルを変更することはできません)。
<wsp:Policy wsu:Id="myService_policy"> <wsp:ExactlyOne> <wsp:All> <wsoma:OptimizedMimeSerialization xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" /> </wsp:All> </wsp:ExactlyOne> </wsp:Policy>
コンパイルされたJWSファイルをWebLogic Serverにデプロイする際には、MTOM WS-Policyファイルを参照する次のスニペットが動的WSDL内に自動的に含まれます。このスニペットは、WebサービスがMTOM/XOPを使用することを示しています。
<wsdl:binding name="BasicHttpBinding_IMtomTest" type="i0:IMtomTest"> <wsp:PolicyReference URI="#myService_policy" /> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
JWSファイルで@Policy
メタデータ・アノテーションを指定することによって、開発時にWebサービスとMtom.xml
WS-Policyファイルを関連付けることができます。必須であるMtom.xml
ファイルへの参照が動的WSDLに確実に含まれるよう、必ずattachToWsdl=true
属性も指定します。次の例を参照してください。
デプロイメント時にWebサービスとMtom.xml
WS-Policyファイルを関連付けるには、デプロイメント直前にtypesセクションにポリシーを追加し、WSDLを修正します。
また、管理コンソールを使用して、実行時にファイルを添付することもできます。詳細は、Oracle Fusion Middleware Oracle WebLogic Server管理コンソール・ヘルプの「WS-PolicyファイルとWebサービスとの関連付け」を参照してください。この項では、JWSアノテーションの使用方法について説明します。
注意: このリリースのWebLogic Serverでは、MTOM/XOP使用時にサポートされるJavaデータ型はbyte[] のみです。その他のバイナリ・データ型(image など)はサポートされていません。
このリリースのWebLogic Serverでは、非推奨になった9.xセキュリティ・ポリシーのあるMTOMの使用はサポートされていません。 |
MTOM/XOPを使用してバイナリ・データを送信するには、次の手順に従います。
次の簡単なJWSファイルに示すように、JWSファイル内でWebLogic固有の@weblogic.jws.Policy
アノテーションを使用し、あらかじめパッケージ化されたMtom.xml
ファイルをWebサービスに適用することを指定します(該当するコードは太字で示してあります)。
package examples.webservices.mtom; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.jws.Policy; @WebService(name="MtomPortType", serviceName="MtomService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="mtom", serviceUri="MtomService", portName="MtomServicePort") @Policy(uri="policy:Mtom.xml", attachToWsdl=true) public class MtomImpl { @WebMethod public String echoBinaryAsString(byte[] bytes) { return new String(bytes); }
結果として得られるSOAPメッセージでMTOM/XOPを使用してバイナリ・データの送受信を行う場合は必ず、Webサービス・オペレーションでJava byte[]
データ型を戻り値または入力パラメータとして使用します。一例として、前述のechoBinaryAsString
オペレーションの実装を参照してください。このオペレーションでは、単純にbyte
の配列を入力として取り、それをString
として戻しています。
WebLogic WebサービスのランタイムにはMTOM/XOPのサポートが組み込まれており、clientgen
Antタスクによりクライアント側アーティファクトが生成されるWSDLでMTOM/XOPのサポートが指定されている場合に有効になります。クライアント・アプリケーション自体では、関連データ型としてbyte[]
を使用して、通常どおりオペレーションを呼び出します。
MTOM/XOP機能そのものとWebLogic JAX-RPC Webサービスでサポートされる仕様のバージョンの詳細は、SOAP Message Transmission Optimization Mechanism仕様(http://www.w3.org/TR/2005/REC-soap12-mtom-20050125
)を参照してください。
@weblogic.jws.StreamAttachments
JWSアノテーションを使用すると、添付ファイルを含む着信SOAPメッセージを読み取る際に、メッセージ全体をメモリーに読み込むデフォルト動作のかわりに、WebサービスでストリーミングAPIを使用することを指定できます。この機能を使用すると、SOAPメッセージが非常に大きい場合のWebサービスのパフォーマンスを向上させることができます。
添付ファイルをストリーミングすることを指定した例については、『Oracle Fusion Middleware Oracle WebLogic Server Webサービス・リファレンス』の「weblogic.jws.StreamAttachments」を参照してください。
WebLogic Webサービスでは、Webサービスとそのクライアントの間でデータや呼出しを転送する際のメッセージ・フォーマットとして、バージョン1.1のSimple Object Access Protocol(SOAP)がデフォルトで使用されます。WebLogic Webサービスでは、SOAP 1.1と新しいSOAP 1.2の両バージョンがサポートされており、どちらのバージョンも自由に使用できます。
Webサービスでバージョン1.2のSOAPを使用することを指定するには、次の例に示すように、JWSファイルでクラス・レベルの@weblogic.jws.Binding
アノテーションを使用して、その唯一の属性の値をBinding.Type.SOAP12
に設定します(該当するコードは太字で示してあります)。
package examples.webservices.soap12; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.jws.Binding; @WebService(name="SOAP12PortType", serviceName="SOAP12Service", targetNamespace="http://example.org") @WLHttpTransport(contextPath="soap12", serviceUri="SOAP12Service", portName="SOAP12ServicePort") @Binding(Binding.Type.SOAP12) /** * This JWS file forms the basis of simple Java-class implemented WebLogic * Web Service with a single operation: sayHello. The class uses SOAP 1.2 * as its binding. * */ public class SOAP12Impl { @WebMethod() public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
WebサービスでSOAP 1.2を使用する上で、このアノテーションを設定する以外に必要な作業はありません(Webサービスを呼び出すクライアント・アプリケーションの変更も不要です)。WebLogic Webサービス・ランタイムによってすべて自動的に処理されます。
このアノテーションの詳細は、『Oracle Fusion Middleware Oracle WebLogic Server Webサービス・リファレンス』の「weblogic.jws.Binding」を参照してください。
クライアント・アプリケーションからWebLogic Webサービス・オペレーションを呼び出す場合、オペレーション呼出しはデフォルトではトランザクションのコンテキストの外で実行されます。トランザクション内でオペレーションを実行するには、次の例に示すように、JWSファイルで@weblogic.jws.Transactional
アノテーションを指定して、ブール型のvalue
属性の値をtrue
に設定します(該当するコードは太字で示してあります)。
package examples.webservices.transactional; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.jws.Transactional; @WebService(name="TransactionPojoPortType", serviceName="TransactionPojoService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="transactionsPojo", serviceUri="TransactionPojoService", portName="TransactionPojoPort") /** * This JWS file forms the basis of simple WebLogic * Web Service with a single operation: sayHello. The operation executes * as part of a transaction. * */ public class TransactionPojoImpl { @WebMethod() @Transactional(value=true) public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
Webサービスのすべてのオペレーションをトランザクション内で実行する場合は、@Transactional
アノテーションをクラス・レベルで指定します。一部のオペレーションのみをトランザクション内で実行する場合は、このアノテーションをメソッド・レベルで指定します。競合が発生した場合は、メソッド・レベルの値でクラス・レベルの値がオーバーライドされます。
追加属性の詳細は、『Oracle Fusion Middleware Oracle WebLogic Server Webサービス・リファレンス』の「weblogic.jws.Transactional」を参照してください。
Webサービスでトランスポート・プロトコルとしてHTTPを使用する場合は、次の例に示すように、Oracle Fusion Middleware Oracle WebLogic Server APIリファレンスのweblogic.wsee.connection.transport.servlet.HttpTransportUtils
APIを使用して、JAX-RPC ServletEndpointContext
オブジェクトからjavax.servlet.http.HttpServletRequest
およびjavax.servlet.http.HttpServletResponse
オブジェクトを取得できます(該当するコードを太字で示し、例の後で解説を加えます)。
package examples.webservices.http_transport_utils; import javax.xml.rpc.server.ServiceLifecycle; import javax.xml.rpc.server.ServletEndpointContext; import javax.xml.rpc.ServiceException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.jws.WebMethod; import javax.jws.WebService; import weblogic.jws.WLHttpTransport; import weblogic.wsee.connection.transport.servlet.HttpTransportUtils; @WebService(name="HttpTransportUtilsPortType", serviceName="HttpTransportUtilsService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="servlet", serviceUri="HttpTransportUtils", portName="HttpTransportUtilsPort") public class HttpTransportUtilsImpl implements ServiceLifecycle { private ServletEndpointContext wsctx = null; public void init(Object context) throws ServiceException { System.out.println("ServletEndpointContext inited..."); wsctx = (ServletEndpointContext)context; } public void destroy() { System.out.println("ServletEndpointContext destroyed..."); wsctx = null; } @WebMethod() public String getServletRequestAndResponse() { HttpServletRequest request = HttpTransportUtils.getHttpServletRequest(wsctx.getMessageContext()); HttpServletResponse response = HttpTransportUtils.getHttpServletResponse(wsctx.getMessageContext()); System.out.println("HttpTransportUtils API used successfully."); return "HttpTransportUtils API used successfully"; } }
上の例の中で重要な部分は以下のとおりです。
必要なJAX-RPCおよびServletクラスのインポート。
import javax.xml.rpc.server.ServiceLifecycle; import javax.xml.rpc.server.ServletEndpointContext; import javax.xml.rpc.ServiceException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
WebLogic HttpTransportUtils
クラスのインポート。
import weblogic.wsee.connection.transport.servlet.HttpTransportUtils;
JAX-RPCメッセージ・コンテキストを問い合せることになるため、JWSファイルではServiceLifecycle
を明示的に実装する必要があります。
public class HttpTransportUtilsImpl implements ServiceLifecycle
データ型ServletEndpointContext
の変数の作成。
private ServletEndpointContext wsctx = null;
JWSファイルでServiceLifecycle
を実装するため、init
およびdestroy
ライフサイクル・メソッドも実装する必要があります。
public void init(Object context) throws ServiceException { System.out.println("ServletEndpointContext inited..."); wsctx = (ServletEndpointContext)context; } public void destroy() { System.out.println("ServletEndpointContext destroyed..."); wsctx = null; }
最後に、Webサービス・オペレーションを実装するメソッドで、ServletEndpointContext
オブジェクトを使用してHttpServletRequest
およびHttpServletResponse
オブジェクトを取得します。
HttpServletRequest request = HttpTransportUtils.getHttpServletRequest(wsctx.getMessageContext()); HttpServletResponse response = HttpTransportUtils.getHttpServletResponse(wsctx.getMessageContext());
以下のリストでは、JWSファイルをプログラミングする場合のベスト・プラクティスを示します。
document-literal-bareのWebサービスを作成する場合は、@WebParam
JWSアノテーションを使用して、特定のWebサービスのすべてのオペレーションのすべての入力パラメータに一意の名前を付けるようにします。document-literal-bareのWebサービスの性質上、@WebParam
アノテーションを使用して入力パラメータの名前を明示的に指定しない場合、WebLogic Serverが入力パラメータの名前を作成するため、Webサービス内でパラメータの名前が重複するおそれがあります。
一般に、最も相互運用性の高いタイプのWebサービスは、document-literal-wrappedのWebサービスです。
ハード・コード化された名前return
に常に依存するのではなく、@WebResult
JWSアノテーションを使用して、オペレーションの戻り値の名前を明示的に設定します。JWSファイルで@WebResult
アノテーションを使用しない場合、returnが戻り値のデフォルト名になります。
Webサービスの呼出し中にエラーが発生した場合に、クライアント・アプリケーションに戻される例外情報を制御するには、JWSファイルでSOAPFaultException
を使用します。
必須ではありませんが、JWSファイルでWebLogic固有の@WLHttpTransport
アノテーションのportName
属性を常に指定することをお薦めします。この属性を指定しない場合、jwsc
AntタスクはWSDLファイルの生成時にポート名を生成しますが、この名前はユーザーにとってわかりにくい場合があります。その結果、Webサービスを呼び出すためにクライアント・アプリケーションで使用するgetXXX()
メソッドの名前が適切に指定されなくなります。クライアント・アプリケーションがWebサービスを呼び出すときにわかりやすいメソッドを使用できるようにするには、portName
属性を使用して、Webサービスの該当するポート名を指定します。