| Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3 JAX-RPC Webサービスの開発 12c (12.1.3) E57562-03 |
|
![]() 前 |
![]() 次 |
この章では、Java API for XML-based RPC (JAX-RPC)を使用したWebLogic Server 12.1.3のWebLogic 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 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 WebLogic Server WebLogic Webサービス・リファレンス』のJWSアノテーション・リファレンスに関する項を参照してください。他のJWSアノテーションを使用して、より高度な機能(Webサービスの信頼性のあるメッセージング、会話、SOAPメッセージ・ハンドラなど)をプログラミングする方法については、第II部「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 |
|
|
|
8 |
|
|
|
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アノテーションと同じです。
(style=SOAPBinding.Style.DOCUMENT属性と一緒に) parameterStyle属性を使用して、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サービスはこのコンテキストを使用してサービスに関する実行時情報にアクセスし、場合によっては変更することもできます。この情報の大半は、現在の会話が終了したかどうか、現在の会話のプロパティ値、実行時の会話のプロパティの変更など、会話に関連しています。(会話および実装方法の詳細は、第9章「会話型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 WebLogic Server Java 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 WebLogic Server Java 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://download.oracle.com/javaee/6/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章「JAX-RPC 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 WebLogic Server Enterprise JavaBeansバージョン2.1の開発』の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 WebLogic Server Enterprise JavaBeansバージョン2.1の開発』の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で指定されています。要件の詳細と完全なリストについては、JAX-RPC仕様(http://java.net/projects/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を拡張した例外を明示的にスローする必要があります。ユーザー定義の例外の作成とスローの詳細は、JAX-RPC仕様(http://java.net/projects/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の実装を使用することもできます。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バイナリ最適化を使用することは必須ではありません。むしろ、この仕様では、ランタイムがこれを選択して行うようになっています。これは場合によっては、直接SOAPメッセージ内にbase64binaryデータを送信するほうが、より効率的であるとランタイムで判断されることがあるためです。一例としては、トランスポートされるデータ量が少なく、単にデータをそのままインライン処理するよりも多くのリソースが、会話およびトランスポートのオーバーヘッドにより消費されてしまう場合が挙げられます。しかしながら、JAX-RPCサービスのMTOM用WebLogic Webサービスの実装では、MTOMが有効化されている場合には、常にMTOM/XOPが使用されます。
WebLogic JAX-RPC WebサービスでのMTOM/XOPのサポートは、あらかじめパッケージ化されたWS-PolicyファイルMtom.xmlを使用して実装されます。WS-Policyファイルは、http://www.w3.org/TR/ws-policyで説明されている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ファイルを関連付けることができます。動的WSDLに、必須であるMtom.xmlファイルへの参照が確実に含まれるよう、必ずattachToWsdl=true属性も指定します。下記の例を参照してください。
デプロイメント時にWebサービスとMtom.xml WS-Policyファイルを関連付けるには、デプロイメント直前にtypesセクションにポリシーを追加し、WSDLを修正します。
また、WebLogic Server管理コンソールを使用して実行時にファイルを追加できます。詳細は、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 WebLogic Server Webサービス・リファレンス』のweblogic.jws.StreamAttachmentsに関する項を参照してください。
WebLogic Webサービスでは、Webサービスとそのクライアントの間でデータや呼出しを転送する際に、メッセージ・フォーマットとしてデフォルトでバージョン1.1のSOAP (Simple Object Access Protocol)が使用されます。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 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 WebLogic Server Webサービス・リファレンス』のweblogic.jws.Transactionalに関する項を参照してください。
Webサービスでトランスポート・プロトコルとしてHTTPを使用する場合は、次の例に示すように、Oracle WebLogic Server Java 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サービスの該当するポート名を指定します。