Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この章では、SOAPヘッダーを処理する方法について説明します。
WebServicesAssemblerツールを使用すると、WSDLファイルのwsdl:binding
要素で定義されているSOAPヘッダー・ブロックを、生成されるサービス・エンドポイント・インタフェース(SEI)のメソッド・パラメータにマップできます。これにより、SOAPヘッダー・ブロックには、サービス・エンドポイント・インタフェースを実装するメソッド内から直接アクセスできるようになります。
例17-1に、SOAPヘッダーを明示的に定義する単純なWSDLを示します。
<definition xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://test.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <types/> <message name="HelloHeader"> <part name="header" type="xs:string"/> </message> <message name="HelloMessage"> <part name="body" type="xs:string"/> </message> message name="HelloMessageResponse"/> <portType name="HelloPortType"> <operation name="sayHello"> <input message="tns:HelloMessage"/> <output message="tns:HelloMessageResponse/> </operation> </portType> <binding name="HelloBinding" type="tns:HelloPortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="sayHello"> <input> <soap:body use="literal" namespace="http://test.com"/> <!--the SOAP header must be defined here --> <soap:header message=""tns:HelloHeader" part="header" use="literal"/> </input> <output> <soap:body use="literal" namespace="http://test.com"/> </output> </operation> </binding> <service name="HelloService"> <port name="HelloPort" binding="tns:HelloBinding"> <soap:address location="http://localhost:8888/hello-service/hello-service"/> </port> </service> </definition>
WebServicesAssemblerツールは、パラメータにSOAPヘッダーをマップするためのブール型引数mapHeadersToParameters
を提供します。この引数のデフォルトはtrue
のため、SOAPヘッダーを抑止する場合を除いて明示的に指定する必要はありません。
AntタスクまたはWebServicesAssemblerツールの使用によるパラメータ・マッピングにより、サービス・エンドポイント・インタフェースを生成できます。次のAntタスクのサンプルでは、SOAPヘッダーを、hello-service
Webサービスのパラメータにマップしています。
<oracle:topDownAssemble appName="hello-service" wsdl="Hello.wsdl" input="./classes" output="build" ear="dist/hello-service.ear" packageName="oracle.demo " mapHeadersToParameters="true" > <oracle:porttype className="oracle.demo.HelloImpl" /> </oracle:topDownAssemble>
次の例は、前述の例のWebServicesAssemblerコマンドライン・バージョンです。
java -jar wsa.jar -topDownAssemble -wsdl Hello.wsdl -output build -ear dist/hello-services.ear -mapHeadersToParameters true -packageName oracle.demo
このコマンドおよびAntタスクの説明:
topDownAssemble
: WSDL記述をベースにしたWebサービスで必要となるクラスとデプロイメント・ディスクリプタを作成します。これらのファイルは、EARファイル、WARファイル、ディレクトリのいずれにも格納できます。topDownAssembleを参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
ear
: 生成されるEARファイルの名前と位置を指定します。「ear」を参照してください。
mapHeadersToParameters
: 生成されるJavaコード内の各メソッド用のパラメータに、WSDLで定義されているSOAPヘッダーをマップするかどうかを指定します。「mapHeadersToParameters」を参照してください。
packageName
: JAX-RPCマッピング・ファイルにパッケージ名が宣言されていない場合に、生成されたクラス用に使用されるパッケージ名を指定します。「packageName」を参照してください。次のWebServicesAssemblerコマンドおよびAntタスクを使用すると、mapHeaderstoParameters
引数をコールできます。これらのコマンドの詳細は、第18章「WebServicesAssemblerの使用方法」を参照してください。
JAX-RPCハンドラを使用すると、明示的と暗黙的の両方のSOAPヘッダーを処理できます。明示的SOAPヘッダーとは、WSDLドキュメントに定義されているSOAPヘッダーのことです。例17-1に、SOAPヘッダーが定義されている単純なWSDLを示します。暗黙的SOAPヘッダーとは、必ずしも特定のWSDLドキュメントで定義されているとはかぎらないが、SOAPエンベロープに含まれているものです。
ハンドラでは、javax.xml.rpc.handler.Handler
インタフェースで定義されたメソッドを使用してSOAPヘッダーにアクセスできます。これらのメソッドは次のとおりです。
boolean handleRequest(MessageContext context); boolean handleResponse(MessageContext context); boolean handleFault(MessageContext context);
これらのメッセージの各context
引数を使用して、SOAPエンベロープ内のSOAPヘッダーを表示できます。次に、SOAPリクエストのヘッダーを表示するハンドラ実装の例を示します。
boolean handleRequest(MessageContext context){ javax.xml.rpc.handler.soap.SOAPMessageContext smc = (javax.xml.rpc.handler.soap.SOAPMessageContext)context; javax.xml.soap.SOAPHeader sh = smc.getSOAPMessage.getSOAPHeader(); //the SOAPHeader will contain a list of SOAPHeaderElements (header blocks) Iterator it = sh.examineAllHeaderElements(); //iterate through all the SOAP header elements and print their names while(it.hasNext()){ javax.xml.soap.SOAPHeaderElement elem = (SOAPHeaderElement)it.next(); System.out.println(elem.getElementName().getQualifiedName()); } return true; }
サービス・エンドポイントのライフ・サイクルは、javax.xml.rpc.server.ServiceLifecycle
インタフェースを実装することで管理できます。このインタフェースには次のメソッドがあります。
void init(Object context); void destroy();
ランタイム・システムは、init
メソッドを起動し、context
オブジェクトを渡します。context
オブジェクトには、ServletEndpointContext
オブジェクトが含まれています。このオブジェクトからSOAPMessageContext
を抽出し、起動のたびにヘッダーを処理できます。
例17-2は、javax.xml.rpc.server.ServiceLifecycle
インタフェースを使用してSOAPヘッダーにアクセスする方法を示しています。
public class HelloImpl implements HelloPortType,ServiceLifecycle{ private Object m_context; public void sayHello(String body){ javax.xml.rpc.server.ServletEndpointContext sec = (ServletEndpointContext)m_context; javax.xml.rpc.handler.soap.SOAPMessageContext mc = (SOAPMessageContext)sec.getMessageContext(); javax.xml.soap.SOAPHeader sh = mc.getSOAPMessage().getSOAPHeader(); // from here you can process all the header // blocks in the SOAP header. } //this will be called by the runtime system. public void init(Object context){ m_context = context; } public void destroy(){ } }
このインタフェースを実装することで、明示的および暗黙的の両方のSOAPヘッダーを処理できます。ただし、暗黙的ヘッダーを処理する場合にとっての方が利便性は高くなります。
次の各項では、静的スタブ・クライアントおよびDynamic Invocation Interface(DII)クライアントがHTTPのレスポンスおよびリクエストからヘッダーを取得する方法を説明します。
J2SEおよびJ2EEの静的スタブ・クライアントは、oracle.webservices.ServerConstants
クラスのHTTP_SERVLET_REQUEST
プロパティおよびHTTP_SERVLET_RESPONSE
プロパティを使用して、HTTPメッセージのヘッダーにアクセスできます。サービス実装クラスでは、Webサービスのコール元がHTTPトランスポートを使用するときに、このプロパティを使用することでHTTPサーブレットのリクエストまたはレスポンスを取得できます。
これらのプロパティを使用するには、サービス実装ではjavax.xml.rpc.server.ServiceLifecyle
を実装し、init
メソッドに渡されたObject
を保存する必要があります。このオブジェクトはjavax.xml.rpc.server.ServletEndpointContext
のインスタンスです。
サービス実装クラスのメソッドが起動されると、ServletEndpointContext.
getMessageContext
メソッドによりjavax.xml.rpc.handler.MessageContext
が戻されます。MessageContext
.getProperty
メソッドは、HTTP_SERVLET_REQUEST
またはHTTP_SERVLET_RESPONSE
をプロパティ名として使用できます。
HTTP_SERVLET_REQUEST
が要求されたプロパティである場合、戻されるオブジェクトは、javax.servlet.http.HttpServletRequest
のインスタンスです。HTTP_SERVLET_RESPONSE
が要求されたプロパティである場合、戻されるオブジェクトは、javax.servlet.http.HttpServletResponse
のインスタンスです。
例17-3に、HTTPリクエスト・ヘッダーを取得してIPアドレスを取得する方法を示します。この例では、HelloImpl
クラスによりServiceLifecycle
インタフェースが実装されています。この場合、init
メソッドに渡されたcontext
オブジェクトは、ServletEndpointContext
オブジェクトにキャストされています。destroy
メソッドにより、サービスのライフ・サイクルが破棄されています。getIPAddress
メソッドの実装では、getMessageContext
メソッドにより、ServletEndpointContext
オブジェクトからメッセージ・コンテキストが引き出されます。getProperty
メソッドでは、HTTP_SERVLET_REQUEST
プロパティを使用し、HttpServletRequest
オブジェクトとしてリクエストを戻します。getRemoteAddr
メソッドでは、IPアドレスが戻されます。
public class HelloImpl implements ServiceLifecycle { ServletEndpointContext m_context; public void init(Object context) throws ServiceException { m_context = (ServletEndpointContext)context; } public void destroy() { } public String getIPAddress(){ HttpServletRequest request = (HttpServletRequest)m_context. getMessageContext().getProperty(ServerConstants.HTTP_SERVLET_REQUEST); return request.getRemoteAddr(); } }
Dynamic Invocation Interface(DII)クライアントは、oracle.webservices.OracleCall
インタフェースのメソッドを使用して、HTTPリクエストおよびレスポンスのヘッダーを取得できます。レスポンス・ヘッダーを取得するには、getResponseHeaders()
メソッドを使用します。このメソッドはVector
を戻します。Vector
内の要素が、SOAPレスポンス・ヘッダーです。
リクエスト・ヘッダーを取得するには、getHeaders()
メソッドを使用します。このメソッドもVector
を戻し、その要素がSOAPレスポンス・ヘッダーです。通常、ヘッダーは、addHeaders()
メソッドでVector
に追加されます。
例17-4は、レスポンス・ヘッダーを取得するためのDIIクライアント・コードです。
... OracleCall call = (OracleCall)port.getCall(); Vector headers = call.getResponseHeaders(); if (Vector != null) { for(int i = 0;i < headers.size();i++) { Element header = (Element) headers.get(i); // do something with the header Element ... } } ...
Web Services Invocation Framework(WSIF)のDIIクライアントがメッセージ・ヘッダーを取得する方法の詳細は、『Oracle Application Server Web Servicesアドバンスト開発者ガイド』のWSIFサービスのDIIクライアントによるメッセージ・ヘッダーの取得方法に関する項を参照してください。
「SOAPヘッダーの処理」を参照してください。
詳細は、次を参照してください。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|