Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC を使用した Web サービス入門 11g リリース 1 (10.3.1) B55567-01 |
|
戻る |
次へ |
以下の節では、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 ファイルで、http://www.jcp.org/en/jsr/detail?id=181
にある Web Services Metadata for the Java Platform 仕様 (JSR-181) で指定されている標準の JWS アノテーションに加えて、ビルドする Web Service タイプ (JAX-WS または JAX-RPC) に基づく追加アノテーションのセットを使用できます。サポートされている JWS アノテーションの完全なリストについては、『Oracle Fusion Middleware Oracle WebLogic Server Web サービス リファレンス』の「Web サービスのアノテーション サポート」を参照してください。
JWS ファイルをプログラミングする際は、基本的な Web サービス機能をプログラムするためにアノテーションを含めます。アノテーションは、JWS ファイル内のさまざまなレベル、さまざまな対象で使用されます。一部のアノテーションはクラス レベルで使用され、そのアノテーションが JWS ファイル全体に適用されることを示します。それ以外のアノテーションには、メソッド レベルで使用するものや、パラメータ レベルで使用するものがあります。
JWS ファイルをプログラミングする場合は、http://www.jcp.org/en/jsr/detail?id=181
にある Web Services Metadata for the Java Platform 仕様 (JSR-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 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; // 標準の JWS アノテーション インタフェースをインポートする import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; // WebLogic 固有の JWS アノテーション インタフェースをインポートする import weblogic.jws.WLHttpTransport; // Web サービスの portType 名を「SimplePortType」、サービス名を「SimpleService」、 // 生成される WSDL で使用される targetNamespace を「http://example.org」と指定する、 // 標準の JWS アノテーション。 @WebService(name="SimplePortType", serviceName="SimpleService", targetNamespace="http://example.org") // サービスと SOAP メッセージ プロトコルのマッピングを指定する、 // 標準の JWS アノテーション。特に、SOAP メッセージが // document-literal-wrapped 型であることを指定する。 @SOAPBinding(style=SOAPBinding.Style.DOCUMENT, use=SOAPBinding.Use.LITERAL, parameterStyle=SOAPBinding.ParameterStyle.WRAPPED) // Web サービスの URI を構成するのに使用されるコンテキスト パスとサービス URI が // 「simple/SimpleService」であることを指定する、 // WebLogic 固有の JWS アノテーション @WLHttpTransport(contextPath="simple", serviceUri="SimpleService", portName="SimpleServicePort") /** * この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な * Java クラス実装の WebLogic Web サービスの基本となる * */ public class SimpleImpl { // メソッドがパブリック オペレーションとして公開されることを指定する、 // 標準の JWS アノテーション。アノテーションにはメンバー値の // 「operationName」が含まれていないので、オペレーションのパブリック名は // メソッド名 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
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services Metadata for the Java Platform (JSR 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
アノテーションの詳細については、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services Metadata for the Java Platform (JSR 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
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services Metadata for the Java Platform (JSR 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
アノテーションの属性はいずれも必須ではありません。各属性のデフォルト値については、http://www.jcp.org/en/jsr/detail?id=181
にある「Web Services Metadata for the Java Platform (JSR 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") /** * @Context アノテーションの使い方を示す簡単な Web サービス。 */ 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; } }
上記の例の太字のコードで示すように、Web サービスの実行時コンテキストにアクセスするには、JWS ファイルで以下のガイドラインに従います。
@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;
Web サービスが最初に呼び出されるときに、WebLogic Server はアノテーションの付いた変数 (この場合は ctx
) に JwsContext
の実行時実装を自動的に割り当てます。そのため、コード内で明示的に初期化しないでも、この変数を後で使用できます。
JwsContext
クラスのメソッドを使用して、Web サービスの実行時情報にアクセスする。以下の例では、Web サービスの呼び出しに使用されたプロトコルを取得する方法を示します。
Protocol protocol = ctx.getProtocol();
使用できるメソッドの詳細なリストについては、「JwsContext のメソッド」を参照してください。
次の表では、Web サービスに関する実行時情報にアクセスするために JWS ファイルで使用できる JwsContext
のメソッドについて簡単に説明します。JwsContext
や、Protocol
と ServiceHandle
などの他のコンテキスト関連の API に関する詳細なリファレンス情報については、『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 サービス クライアントの開発に関する詳細については、「Web サービスの呼び出し」を参照してください。
次の表では、Web サービスに関する実行時情報にアクセスするために JWS ファイルで使用できる 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 エンタープライズ 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 エンタープライズ 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") /** * この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な * EJB 実装の WebLogic Web サービスの基本となる。オペレーションはトランザクションの * 一部として実行される。 * */ 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 + "'"; } // 標準の EJB メソッド。通常、メソッドをオーバーライドする必要はない 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; /** * Integer、String、および String[] 型のプロパティを持つ、 * Basicstruct という簡単な JavaBean を定義する。 */ public class BasicStruct { // プロパティ private int intValue; private String stringValue; private String[] stringArray; // ゲッター メソッドおよびセッター メソッド 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; // 標準の JWS アノテーション インタフェースをインポートする import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; // WebLogic 固有の JWS アノテーション インタフェースをインポートする import weblogic.jws.WLHttpTransport; // 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 の実装を使用することもできます。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; // @WebService アノテーションをインポートする import javax.jws.WebService; // WLHttpTransport をインポートする import weblogic.jws.WLHttpTransport; @WebService(serviceName="SoapExceptionsService", name="SoapExceptionsPortType", targetNamespace="http://example.org") @WLHttpTransport(contextPath="exceptions", serviceUri="SoapExceptionsService", portName="SoapExceptionsServicePort") /** * この JWS ファイルは、1 つのオペレーション sayHelloWorld を含む簡単な * Java クラス実装の WebLogic Web サービスの基本となる * */ public class SoapExceptionsImpl { public SoapExceptionsImpl() { } public void tirarSOAPException() { Detail detail = null; try { SOAPFactory soapFactory = SOAPFactory.newInstance(); detail = soapFactory.createDetail(); } catch (SOAPException e) { // 何らかの処理を行う } 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 クライアントからの 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 を修正します。
また、Administration Console を使用して実行時にファイルを追加できます。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server Administration Console ヘルプ』の「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 サービスでサポートされる仕様バージョンの詳細については、http://www.w3.org/TR/2005/REC-soap12-mtom-20050125
にある「SOAP Message Transmission Optimization Mechanism」を参照してください。
@weblogic.jws.StreamAttachments
JWS アノテーションを使用すると、添付ファイルを含む着信 SOAP メッセージを読み込む際に、メッセージ全体をメモリに読み込むデフォルト動作の代わりに、Web サービスでストリーミング API を使用することを指定できます。この機能を使用すると、非常に大きい SOAP メッセージを読み込む際の Web サービスのパフォーマンスを向上させることができます。
添付ファイルをストリーミングすることを指定した例については、『Oracle Fusion Middleware 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) /** * この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な * Java クラス実装の WebLogic Web サービスの基本となる。このクラスでは、バインディングとして * SOAP 1.2 を使用する。 * */ 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") /** * この JWS ファイルは、1 つのオペレーション sayHello を含む * 簡単な WebLogic Web サービスの基本となる。オペレーションはトランザクションの * 一部として実行される * */ 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 WebLogic Server 用の Oracle Fusion Middleware WebLogic Web サービス リファレンス』の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 サービスの関連するポート名を指定します。