ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイド
11g リリース1(10.3.6)
B61647-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

4 JWSファイルのプログラミング

この章では、Java API for XML-based RPC (JAX-RPC)を使用したWebLogic Webサービスを実装するJWSファイルのプログラミング方法について説明します。

この章では、以下のトピックについて説明します。

JWSファイルとJWSアノテーションの概要

WebLogic Webサービスをゼロからプログラミングする方法は2つあります。

  1. JSR-181、JAX-WS仕様、およびWebLogic Webサービス・プログラミング・モデルで規定されているように、標準のEJBまたはJavaクラスにWebサービスJavaアノテーションを付けます。

  2. デプロイメント記述子、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ファイルのJava要件

JWSファイルをプログラミングする場合は、Web Services Metadata for the Java Platform仕様(JSR-181)(http://www.jcp.org/en/jsr/detail?id=181)で指定された一連の要件に従う必要があります。特に、Webサービスを実装するJavaクラスは、次の要件に従う必要があります。

JWSファイルのプログラミング:一般的な手順

次の手順では、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アノテーションはjavax.jwsまたはjavax.jws.soapパッケージにあります。例:

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

2

JWSファイルで使用するWebLogic固有のアノテーションをインポートします。

WebLogic固有のアノテーションはweblogic.jwsパッケージにあります。例:

import weblogic.jws.WLHttpTransport;

3

必須の標準@WebService JWSアノテーションをクラス・レベルで追加して、JavaクラスがWebサービスを公開することを指定します。

「JWSファイルがWebサービスを実装することの指定(@WebServiceアノテーション)」を参照してください。

4

標準の@SOAPBinding JWSアノテーションをクラス・レベルで追加して、WebサービスとSOAPメッセージ・プロトコルの間のマッピングを指定する(オプション)

特に、このアノテーションを使用して、Webサービスがドキュメント・リテラルか、RPCエンコードかなどを指定します。「WebサービスとSOAPメッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)」を参照してください。

このJWSアノテーションは必須ではありませんが、JWSファイルで明示的に指定し、クライアント・アプリケーションがWebサービスの呼出しに使用するSOAPバインディングのタイプを明確にすることをお薦めします。

5

WebLogic固有の@WLHttpTransport JWSアノテーションをクラス・レベルで追加して、Webサービスを呼び出すURLで使用されるコンテキスト・パスとサービスURIを指定します。(オプション)

「Webサービスのコンテキスト・パスとサービスURIの指定(@WLHttpTransportアノテーション)」を参照してください。

このJWSアノテーションは必須ではありませんが、JWSファイルで明示的に指定し、クライアント・アプリケーションがWebサービスの呼出しに使用するURLを明確にすることをお薦めします。

6

パブリック操作として公開するJWSファイルの各メソッドで標準の@WebMethodアノテーションを追加する(オプション)

必要に応じて、標準の@Onewayアノテーションを使用し、その操作が入力パラメータだけを取り、値を返さないことを指定します。「JWSメソッドをパブリック操作として公開することの指定(@WebMethodおよび@OneWayアノテーション)」を参照してください。

7

@WebParamアノテーションを追加し、公開される操作の入力パラメータの名前をカスタマイズする(オプション)

「操作のパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)」を参照してください。

8

@WebResultアノテーションを追加し、公開される操作の戻り値の名前と動作をカスタマイズする(オプション)

「操作の戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)」を参照してください。

9

独自のビジネス・コードを追加します。

Webサービスが希望どおりに動作するように、独自のビジネス・コードをメソッドに追加します。


JWSファイルの例

次のサンプル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 + "'";
   }
 }

JWSファイルがWebサービスを実装することの指定(@WebServiceアノテーション)

次のコードの抜粋のように、標準の@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メッセージ・プロトコルのマッピングの指定(@SOAPBindingアノテーション)

ここでは、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アノテーションの属性

属性 指定できる値 デフォルト値
style
SOAPBinding.Style.RPC
SOAPBinding.Style.DOCUMENT
SOAPBinding.Style.DOCUMENT
use
SOAPBinding.Use.LITERAL
SOAPBinding.Use.ENCODED
SOAPBinding.Use.LITERAL
parameterStyle
SOAPBinding.ParameterStyle.BARE
SOAPBinding.ParameterStyle.WRAPPED
SOAPBinding.ParameterStyle.WRAPPED

Webサービスのコンテキスト・パスとサービスURIの指定(@WLHttpTransportアノテーション)

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アノテーション・リファレンス」を参照してください。

JWSメソッドをパブリック操作として公開することの指定(@WebMethodおよび@OneWayアノテーション)

標準の@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サービス操作として公開されます。

操作のパラメータとWSDL要素のマッピングのカスタマイズ(@WebParamアノテーション)

標準の@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.INWebParam.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)を参照してください。

操作の戻り値とWSDL要素のマッピングのカスタマイズ(@WebResultアノテーション)

標準の@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サービスの実行時情報へのアクセス

次の各項では、Webサービスの実行時情報へのアクセス方法について説明します。

JwsContextを使用した実行時情報へのアクセス

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サービス・コンテキストへのアクセスに関するガイドライン

コンテキストを使用して、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のメソッド」を参照してください。

JwsContextのメソッド

次の表に、JWSファイル内でWebサービスの実行時情報にアクセスするために使用可能なJwsContextのメソッドの説明を示します。JwsContextおよびその他のコンテキスト関連API(ProtocolServiceHandleなど)の詳細なリファレンス情報については、Oracle Fusion Middleware Oracle WebLogic Server APIリファレンスweblogic.wsee.*パッケージに関する項を参照してください。

表4-3 JwsContextのメソッド

メソッド 戻り値 説明
isFinished()
boolean

現在の会話が終了しているか、またはまだ続いているかを示すブール値を返します。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

finishConversation()
void

現在の会話を終了します。

このメソッドは、@Conversation (Conversation.Phase.FINISH) JWSアノテーションを指定されたメソッドをクライアント・アプリケーションが呼び出すことと同じになります。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

setMaxAge(java.util.Date)
void

会話の新しい最大存続期間を絶対日付のDateに設定します。この日付パラメータが過去の日付である場合、WebLogic Serverは直ちに会話を終了します。

このメソッドは、会話のデフォルトの最大存続期間を指定する、@ConversationalアノテーションのmaxAge属性に相当します。このメソッドを使用して、実行時にこのデフォルト値をオーバーライドします。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

setMaxAge(String)
void

Stringの期間(1 dayなど)を指定して、会話の新しい最大存続期間を設定します。

Stringパラメータの有効な値は、数字と以下のいずれかの語です。

  • seconds

  • minutes

  • hours

  • days

  • years

たとえば、最大存続期間を10分に設定するには、次の構文を使用します。

ctx.setMaxAge("10 minutes")

このメソッドは、会話のデフォルトの最大存続期間を指定する、@ConversationalアノテーションのmaxAge属性に相当します。このメソッドを使用して、実行時にこのデフォルト値をオーバーライドします。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

getMaxAge()
long

許容される会話の最大存続期間を秒単位で返します。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

getCurrentAge()
long

会話の現在の存続期間を秒単位で返します。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

resetIdleTime()
void

現在の会話の最後のアクティビティ以降の秒数を測定するタイマーをリセットします。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

setMaxIdleTime(long)
void

クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数を設定します。

このメソッドは、会話のデフォルトのアイドル時間を指定する、@ConversationalアノテーションのmaxIdleTime属性に相当します。このメソッドを使用して、実行時にこのデフォルト値をオーバーライドします。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

setMaxIdleTime(String)
void

クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数をStringとして設定します。

Stringパラメータの有効な値は、数字と以下のいずれかの語です。

  • seconds

  • minutes

  • hours

  • days

  • years

たとえば、最大アイドル時間を10分に設定するには、次の構文を使用します。

ctx.setMaxIdleTime("10 minutes")

このメソッドは、会話のデフォルトのアイドル時間を指定する、@ConversationalアノテーションのmaxIdleTime属性に相当します。このメソッドを使用して、実行時にこのデフォルト値をオーバーライドします。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

getMaxIdleTime()
long

クライアントの動作がないためにWebLogic Serverが会話を終了するまでに、会話がアイドル状態を維持できる秒数を返します。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

getCurrentIdleTime()
long

最後のクライアント・リクエスト以降の秒数、または、会話の最大アイドル時間のリセット以降の秒数を取得します。

このメソッドは、会話形式のWebサービス、つまり、@Conversationまたは@Conversationalアノテーションが指定されているWebサービスでのみ使用します。

getCallerPrincipal()
java.security.Principal

基本認証が実行されたと想定し、呼び出されたばかりの操作に関連付けられたセキュリティ・プリンシパルを返します。

isCallerInRole(String)
boolean

認証されるプリンシパルが指定されたセキュリティ・ロールに属している場合はtrueを返します。

getService()
weblogic.wsee.jws.ServiceHandle

WebLogic WebサービスAPIのServiceHandleのインスタンスを戻します(このインスタンスに問い合せると、会話ID(Webサービスが会話形式の場合)やWebサービスのURLなど、Webサービスの追加情報を収集できます)。

getLogger(String)
weblogic.wsee.jws.util.Logger

Loggerクラスのインスタンスを取得します(このインスタンスを使用すると、Webサービスからログ・ファイルにメッセージを送信できます)。

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など)を返します。


Stubインタフェースを使用した実行時情報へのアクセス

javax.xml.rpc.Stubインタフェースを使用すると、Webサービス・クライアント・ファイル内でStubインスタンスを動的に構成できます。詳細は、http://download.oracle.com/javaee/5/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

Stubインスタンスで構成可能なプロパティの名前のイテレータ・ビューを返します。

_setProperty()
void

Stubインスタンスの構成プロパティの名前および値を設定します。


以下の表では、Stubインスタンスからアクセスできるjavax.xml.rpc.Stubプロパティ値を定義します。

表4-5 Stubインタフェースのプロパティ

プロパティ タイプ 説明
ENDPOINT_ADDRESS_PROPERTY
java.lang.String

ターゲット・サービス・エンドポイント・アドレス。

PASSWORD_PROPERTY
java.lang.String

認証用パスワード。

SESSION_MAINTAIN_PROPERTY
java.lang.String

サービス・エンドポイントとのセッションに参加するかどうかを示すフラグ。

USERNAME_PROPERTY
java.lang.String

認証用ユーザー名。


ステートレス・セッションEJBを実装すべき場合

jwsc Antタスクでは、JWSファイルを処理するときは常に、Webサービスの基底の実装としてプレーンJavaオブジェクトが選択されます。

しかし、Webサービスの基底の実装をステートレス・セッションEJBにして、EJBが提供するすべての機能(インスタンス・プール、トランザクション、セキュリティ、コンテナ管理による永続性、コンテナ管理による関係、データ・キャッシュなど)を活用することが必要な場合もあります。Webサービスの実装をEJBにする場合は、次の項のプログラミング・ガイドラインに従ってください。


注意:

JAX-RPCはEJB 2.xのみをサポートし、EJB 3.0をサポートしません。

JWSファイルでEJBを実装する場合のプログラミングのガイドライン

一般的なガイドラインは、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ファイルの例

以下の例では、ステートレス・セッション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) {}
 }

ユーザー定義のJavaデータ型のプログラミング

Webサービス操作として公開されるJWSファイルのメソッドでは、パラメータや戻り値として必ずしも組込みのデータ型(Stringやintegerなど)を取る必要はなく、独自に作成するJavaデータ型を使用できます。ユーザー定義のデータ型の例としては、Stringの銘柄記号とintegerの売買株式数という2つのフィールドを持つTradeResultがあげられます。

JWSファイルで、1つまたは複数のメソッドのパラメータまたは戻り値としてユーザー定義のデータ型を使用する場合は、データ型のJavaコードを独自に作成して、JWSファイルにそのクラスをインポートし、適切に使用する必要があります。jwsc Antタスクは、Javaユーザー定義データ型の対応するXMLスキーマ表現、JAX-RPCの型マッピング・ファイルなど、必要なデータ・バインディング・アーティファクトをすべて作成します。

ユーザー定義のデータ型のJavaコードを記述するときは、以下の基本的な要件に従います。

これらの要件は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サービスの呼出し

JWSファイル内から別のWebサービス(WebLogic ServerにデプロイされているWebサービス、または.NETなどの他のアプリケーション・サーバーにデプロイされているWebサービス)を呼び出すことができます。その手順は、「Java SEクライアントからのWebサービスの呼出し」で説明した手順と似ていますが、clientgen Antタスクを実行してクライアント・スタブを生成するのではなく、呼出し側のWebサービスをビルドするjwsc Antタスクに<clientgen>子要素を含めてクライアント・スタブを生成します。続いて、JWSファイルにある標準JAX-RPC APIを使用します。

詳細な手順については、「別のWebサービスからのWebサービスの呼出し」を参照してください。

JWSアノテーションおよびAPIによるその他の機能のプログラミング

次の各項では、JWSファイル内で特定のJWSアノテーションを指定するか、WebLogic WebサービスAPIを使用してプログラミングできるその他の機能について説明します。

MTOM/XOPを使用したバイナリ・データの送信

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を修正します。

また、管理コンソールを使用して実行時にファイルを追加できます。詳細は、『Oracle Fusion Middleware Oracle WebLogic Server管理コンソール・ヘルプ』WS-PolicyファイルとWebサービスとの関連付けに関する項を参照してください。この節では、JWSアノテーションの使用方法について説明します。


注意:

このリリースのWebLogic Serverでは、MTOM/XOP使用時にサポートされるJavaデータ型はbyte[]のみです。その他のバイナリ・データ型(imageなど)はサポートされていません。

このリリースのWebLogic Serverでは、非推奨になった9.xセキュリティ・ポリシーのあるMTOMの使用はサポートされていません。


MTOM/XOPを使用してバイナリ・データを送信するには、次の手順に従います。

  1. 次の簡単な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);
       }
     
    
  2. 結果として得られるSOAPメッセージでMTOM/XOPを使用してバイナリ・データの送受信を行う場合は必ず、Webサービス操作でJava byte[]データ型を戻り値または入力パラメータとして使用します。一例としては、上述のechoBinaryAsString操作の実装を参照してください。この操作では、単純にbyteの配列を入力として取り、それをStringとして返しています。

  3. 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)を参照してください。

SOAP添付ファイルのストリーミング

@weblogic.jws.StreamAttachments JWSアノテーションを使用すると、添付ファイルを含む着信SOAPメッセージを読み取る際に、メッセージ全体をメモリーに読み込むデフォルト動作のかわりに、WebサービスでストリーミングAPIを使用することを指定できます。この機能を使用すると、SOAPメッセージが非常に大きい場合のWebサービスのパフォーマンスを向上させることができます。

添付ファイルをストリーミングすることを指定した例については、『Oracle Fusion Middleware Oracle WebLogic Server Webサービス・リファレンス』の「weblogic.jws.StreamAttachments」を参照してください。

SOAP 1.2の使用

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」を参照してください。

HttpServletRequest/Responseオブジェクトの取得

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プログラミングのベスト・プラクティス

以下のリストでは、JWSファイルをプログラミングする場合のベスト・プラクティスを示します。