この章の内容は、次のとおりです。
Oracle Application Server Web Servicesでは、SOAPメッセージとともにMultipurpose Internet Mail Extension(MIME)添付ファイルを渡すことができます。SOAP with Attachments(SWA)仕様によりこれらのメッセージが定義されます。
SOAP With Attachmentsの仕様に加え、OracleAS Web Servicesでは添付ファイル付きの相互運用可能なSOAPメッセージを定義するWeb Service-Interoperability(WS-I)Attachments Profile 1.0もサポートしています。相互運用性を高めるために、WS-I Attachments ProfileはSWA仕様に特定の契約を追加します。プロファイルには、SOAPメッセージ本体内からMIMEパートを参照するための新しいスキーマ型swaRef
も定義されています。添付ファイル付きの相互運用可能なSOAPメッセージの送信に、このスキーマ型を使用するのは必須ではありません。また、そうすることで必ずプロファイルに準拠できるというわけでもありません。この型はオプションの便利なメカニズムにすぎません。OracleAS Web Servicesは、swaRef
型も、MIME添付ファイル付きのSOAPメッセージを送信するための通常のSWA
もサポートしています。
OracleAS Web Servicesは、SWA
およびswaRef
形式の両方をサポートしており、開発者はその処理内容を把握できます。
関連資料:
|
次のリストで、swaRef
およびSWA
の主な違いを説明します。
swaRef
添付ファイルは一意に識別されるMIME添付ファイルで、URLを使用してSOAP本体で参照されます。SWA
添付ファイルは一意に識別されますが、SOAP本体内から参照するための標準的な方法はありません。
SWA
MIMEパートは、対応するmime:part
のmime:content
要素によって定義されている必要があります。次に、mime:content
要素でSWAとして参照されるClaimPhoto
JPEGファイルの例を示します。
<mime:part> <mime:content part="ClaimPhoto" type="image/jpeg"/> </mime:part>
一方、swaRef
添付ファイルはmime:content
要素で定義する必要はありません。かわりに、wsdl:binding
のsoapbind:body
で参照される必要があります。次に、soapbind:body
要素でswaRef
として参照されるClaimDetail
ファイルの例を示します。ファイルがURLで参照されていることに注意してください。
<mime:part> <soapbind:body use="literal" parts="ClaimDetail" namespace="http://example.com/mimetypes"/> </mime:part>
SWA
添付ファイルは、WSDLに定義されているMIMEコンテンツ・タイプに基づいて、対応するJava型にマッピングされます。たとえば、MIMEコンテンツ・タイプがimage/jpeg
の場合、添付ファイルはjava.awt.Image
を使用して表されます。一方、swaRef
は常にjavax.xml.soap.AttachmentPart
にマッピングされます。
swaRef
型を使用すると、URLを使用してSOAP本体内でMIME添付ファイルを参照できます。WS-Iは、swaRef
型を定義するパブリック・スキーマを公開しています。パブリック・スキーマは、次のXSDによって定義されます。
http://ws-i.org/profiles/basic/1.1/xsd/
この型を使用してWSDLに添付ファイルを定義する方法の詳細は、WS-I Attachments Profile 1.0の4.4項を参照してください。
注意: rpc-literalおよびdocument-literalのWebサービスのみが、WS-I Attachments Profile 1.0によってサポートされています。したがって、これらのタイプのサービスのみがswaRef を使用できます。 |
OracleAS Web Servicesを使用すると、swaRef
のMIME添付ファイルを渡すWebサービスをアセンブルできます。これは次の項で説明します。
swaRef
のMIME添付ファイルを処理および生成できるWebサービスをトップダウン方式でアセンブルするには、WebServicesAssemblerを使用します。これを実行する方法の1つは、genInterface
コマンドの入力としてのswaRef
参照を含むWSDLを作成することです。このコマンドにより、添付ファイルとして渡されるパラメータを持つメソッドを含む、サービス・エンドポイント・インタフェースが生成されます。
生成されたサービス・エンドポイント・インタフェースの実装には、oracle.webservices.attachments
パッケージのクラスおよびメソッドの処理が含まれます。
次に示す一般的な手順で、swaRef
のMIME添付ファイルを渡すメソッドを公開するWebサービスを、トップダウン方式でアセンブルする方法を説明します。
WebサービスをアセンブルするWSDLを用意します。
WSDLにswaRef
XSD用のimport文を入力します。次にimport文の例を示します。
<xsd:import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="http://ws-i.org/profiles/basic/1.1/xsd"/>
swaRef
添付ファイルである必要のあるwsdl:message
の各部分で、type
属性をインポートされたスキーマのswaRef
複合型に設定します。type="wsi:swaRef"
は、swaRef
を複合型に設定する例です。
swaRef
添付ファイルを参照するWSDLの例は、「swaRef添付ファイル付きのWSDLの要件」に示されています。
注意: document-literalサービスの場合、wsi:swaRef 型を持つスキーマに要素を定義し、wsdl:message 部分でその要素を参照する必要があります。これは、Basic Profileでは、document-literalメッセージ部分は型ではなく要素を参照する必要があるためです。
次の例では、メッセージ部分の <!--This is defined in the schema section of the WSDL--> <xsd:element name="Status" type="wsi:swaRef" /> <!--This is the message part that references the swaRef element--> <wsdl:message name="replacePhotoResponse"> <wsdl:part name="status" type="types:Status"/> </wsdl:message> |
WSDLをWebServicesAssemblerのgenInterface
コマンドへの入力として使用します。次に、サンプルのgenInterface
コマンドを示します。
java -jar wsa.jar genInterface -wsdl mySwaRefWsdl -output c:\appDir
このコマンドにより、swaRef
添付ファイルおよびWSDLの各complexType
のJavaクラスを処理するメソッドを持つサービス・エンドポイント・インタフェースが生成されます。AttachmentPart
クラスは、swaRef
のすべてのインスタンスに使用されます。
「添付ファイル付きのサービス・エンドポイント・インタフェースの実装方法」に、生成されたサービス・エンドポイント・インタフェースのサンプルを示します。
生成されたサービス・エンドポイント・インタフェースを実装します。
実装クラスでは、添付ファイルを受信するメソッドにはAttachmentPart
パラメータがあります。一方、swaRef
添付ファイルを送信するメソッドには、戻り型としてのAttachmentPart
があります。メソッドの実装の一部として、AttachmentPart
の新しいインスタンスを作成し、setContent
メソッドを使用して添付ファイルを追加します。
関連資料:
|
swaRef
添付ファイルを使用するWSDLは、次の条件を満たす必要があります。
swaRef
添付ファイルである必要のあるwsdl:message
の各部分で、type属性をインポートされたスキーマのswaRef
複合型に設定する必要があります(または、要素属性をdocument-literalサービスのswaRef
型の要素に設定する必要があります)。
swaRef
添付ファイルが、wsdl:binding
のsoapbind:body
で参照される必要があります。例2-1に、swaRef
参照の形式を示します。soapbind:body
要素には3つの属性があります。
use
: メッセージ書式がliteralであるかencodedであるかを示します。
parts
: 添付ファイルが参照するSOAPメッセージの部分を示します。
namespace
: 添付ファイルのURLを示します。
例2-2に、genInterface
への入力として使用できるswaRef
参照を含むWSDLを示します。ClaimIn
メッセージのClaimDetail
部分により参照されるClaimDetailType
複合型には、swaRef
型である要素ClaimForm
があります。ClaimDetail
部分は、SOAP本体の一部としては参照されないmime:content
要素とは対照的に、バインディングのsoapbind:body
で参照されます。swaRef
スキーマのxsd:import
文のみではなく、前述のリストで説明した要素も太字で強調されています。
例2-2 swaRef添付ファイルを参照するWSDL
<?xml version="1.0"?> <wsdl:definitions xmlns:types="http://example.com/mimetypes" xmlns:ref="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapbind="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://example.com/mimewsdl" xmlns:tns="http://example.com/mimewsdl"> <wsdl:types> <xsd:schema targetNamespace="http://example.com/mimetypes" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="http://ws-i.org/profiles/basic/1.1/xsd"/> <xsd:complexType name="ClaimDetailType"> <xsd:sequence> <xsd:element name="Name" type="xsd:string"/> <xsd:element name="ClaimForm" type="ref:swaRef"/> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <wsdl:message name="ClaimIn"> <wsdl:part name="ClaimDetail" type="types:ClaimDetailType"/> </wsdl:message> <wsdl:message name="ClaimOut"> <wsdl:part name="ClaimRefNo" type="ref:swaRef"/> </wsdl:message> <wsdl:portType name="ClaimPortType"> <wsdl:operation name="SendClaim"> <wsdl:input message="tns:ClaimIn"/> <wsdl:output message="tns:ClaimOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ClaimBinding" type="tns:ClaimPortType"> <soapbind:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="SendClaim"> <soapbind:operation soapAction="http://example.com/soapaction"/> <wsdl:input> <mime:multipartRelated> <mime:part> <soapbind:body use="literal" parts="ClaimDetail" namespace="http://example.com/mimetypes"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <mime:multipartRelated> <mime:part> <soapbind:body use="literal" namespace="http://example.com/mimetypes"/> </mime:part> </mime:multipartRelated> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions>
genInterface
コマンドにより、このWSDLからswaRef
添付ファイル付きのサービス・エンドポイント・インタフェースと、WSDLの各complexType
のJavaクラスが生成されます。AttachmentPart
クラスは、swaRef
のすべてのインスタンスに使用されます。
たとえば、WebServicesAssemblerによりClaimDetail
複合型のJavaクラスが生成されるとします。WSDLのswaRef
型であるclaimForm
パラメータは、JavaコードのAttachmentPart
型として生成されます。次のコード・サンプルに、classシグネチャの一部を示します。
public class ClaimDetail{ private String name; private javax.xml.soap.AttachmentPart claimForm; ... }
swaRef
添付ファイルを参照するWSDLの場合、WebServicesAssemblerによりWSDLの各complexType
のJavaクラスを含むサービス・エンドポイント・インタフェースが生成されます。また、出力メソッドにswaRef
のある各WSDL操作にjava.xml.soap.AttachmentPart
を戻すJavaメソッドも含まれます。
生成されたサービス・エンドポイント・インタフェースの実装では、AttachmentPart
の新しいインスタンスを作成する必要があります。OracleAS Web Servicesは、swaRef
添付ファイルの作成およびアクセスにAttachmentPart
クラスを使用します。AttachmentPart
は抽象クラスであるため、直接インスタンス化することはできません。AttachmentPart
の新しいインスタンスは、添付ファイルを送信するメソッドの実装の一部として作成する必要があります。
例2-3に、戻りパラメータとして添付ファイルを送信するsendClaim
メソッドで生成されたサービス・エンドポイント・インタフェースを示します。例2-4に、インタフェースの実装を示します。
例2-3 添付ファイル付きで生成されたサービス・エンドポイント・インタフェースのサンプル
package com.demo.attachments; import java.xml.soap.AttachmentPart; ... public interface claimPortType extends java.rmi.Remote{ public AttachmentPart sendClaim(ClaimDetail claimDetail) throws java.rmi.RemoteException; }
例2-4の実装クラスでは、sendClaim
メソッドにAttachmentPart
の新しいインスタンスが作成されます。AttachmentPart
インスタンスが作成されると、setContent(Object obj, String mimeType)
メソッドを使用して画像やその他の任意のオブジェクトを追加できます。このメソッドの1つ目のパラメータは添付されるオブジェクトを取り、2つ目のパラメータはそのオブジェクトのMIMEコンテンツ・タイプを指定します。たとえば、GIF画像を送信する場合、setContent
メソッドはsetContent(newPhoto,"image/gif")
となります。
例2-4 サービス・エンドポイント・インタフェースの実装
public class ClaimPortTypeImpl implements ClaimPortType { public AttachmentPart sendClaim(ClaimDetail claimDetail) throws RemoteException{ AttachmentPart impl = null; try{ MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); impl = message.createAttachmentPart(); } catch(SOAPException ex){ return null; } return impl; }
この項では、AttachmentPart
の新しいインスタンスを作成するための基本的なコードを説明します。OracleAS Web Servicesは、swaRef
添付ファイルの作成およびアクセスにAttachmentPart
クラスを使用します。
例2-5に、SAAJ APIを使用してAttachmentPart
の新しいインスタンスを作成するサンプル・コードを示します。javax.xml.soap.SOAPMessage
のcreateAttachmentPart
メソッドは、パラメータとしてオブジェクトとMIMEタイプを指定することに注意してください。
例2-5 AttachmentPartの新しいインスタンスの作成
javax.xml.soap.MessageFactory mf = javax.xml.soap.MessageFactory.newInstance(); javax.xml.soap.SOAPMessage message = mf.createMessage(); javax.xml.soap.AttachmentPart ap = message.createAttachmentPart(attachmentObj,"image/jpeg");
これで、生成されたサービス・インタフェースを実装し、SAAJ APIからAttachmentPart
を使用してswaRef
添付ファイルを送信および受信することができます。
swaRef
MIME添付ファイルを渡すWebサービスをボトムアップ方式でアセンブルするには、WebServicesAssemblerを使用します。これを実行する方法の1つは、assemble
またはgenWsdl
コマンドへの添付ファイルを表すメソッド・パラメータを含むJavaクラスを作成することです。これらのコマンドにより、swaRef
添付ファイルへの参照を含むWSDLが生成されます。
注意: rpc-encodedメッセージ書式を指定すると、WebServicesAssemblerでは、swaRef MIME添付ファイルを渡せるWebサービスをアセンブルできなくなります。このようなサービスをアセンブルするには、別の書式を選択する必要があります。 |
次に示す一般的な手順で、swaRef
MIME添付ファイルを表すWSDLの要素を公開するWebサービスを、ボトムアップ方式でアセンブルする方法を説明します。
Webサービスとして公開するJavaクラスを用意します。
クラス・ファイルでは、添付ファイルを表すパラメータを使用する任意のメソッドは、AttachmentPart
型として識別される必要があります。添付ファイルを使用するメソッドの実装で、AttachmentPart
の新しいインスタンスを作成します。
「AttachmentPartの新しいインスタンスの作成方法」に、SAAJ APIを使用してインスタンスを作成するサンプル・コードを示します。「添付ファイルを処理するサービス・エンドポイント・インタフェースの作成方法」では、添付ファイルを渡すメソッドを含むサービス・エンドポイント・インタフェースを説明します。
WebServicesAssemblerを使用してWSDLファイルを生成します。
WSDLおよびWebサービスのすべてのサービス・アーティファクトをアセンブルする場合は、assemble
コマンドを使用します。
WSDLファイルのみを生成する場合はgenWsdl
コマンドを使用します。
生成されたWSDLファイルには、AttachmentPart
型として識別されるJavaクラスの各パラメータの次の要素が含まれます。
<xsd:element name="..." type="ref:swaRef"/>
「swaRef添付ファイルへの参照を含むWSDLファイルのアセンブル方法」では、genWsdl
コマンドを使用して生成された、swaRef
添付ファイルへの参照を含むWSDLファイルのサンプルを説明します。
genWsdl
コマンドを使用してWSDLを生成した場合は、これでファイルの内容を参照できます。
Webサービスのアセンブルにassemble
コマンドを使用した場合は、これでサービスのデプロイ、プロキシの生成およびクライアントの作成ができます。
関連資料: Webサービスのアセンブルおよびデプロイおよびクライアント・コードの生成の手順の詳細は、『Oracle Application Server Web Services開発者ガイド』の「Javaクラスを使用したWebサービスのアセンブル」を参照してください。 |
サービス・エンドポイント・インタフェースのメソッドにより添付ファイルが渡され、その添付ファイルをswaRef
として渡す必要がある場合には、添付ファイルを表すパラメータはAttachmentPart
型である必要があります。ボトムアップ方式でWebサービスをアセンブルする場合、WebServicesAssemblerによりWSDLに、実装クラスまたはインタフェースで処理する各AttachmentPart
型に対してswaRef
型参照が生成されます。
例2-6に、AttachmentPart
型のパラメータclaimDetail
を含むインタフェースを示します。genWsdl
またはassemble
コマンドを使用してWebServicesAssemblerに渡された場合、このインタフェースによりWSDLファイルが生成されます。
例2-7に、型定義のみを表示したWSDLファイルのフラグメントを示します。この例では、例2-6のインタフェースがgenWsdl
コマンドへの入力として使用され、document-wrappedスタイルのWSDLが生成されたと仮定しています。WSDLフラグメントでは、claimDetail
要素はswaRef
型として識別されます(太字で強調してあります)。
WSDLの生成にassemble
コマンドが使用された場合にも、同じWSDLフラグメントが作成されることに注意してください。これはWebServicesAssemblerにより、AttachmentPart
データ型が処理される際のデフォルトの動作です。
例2-7 タイプ定義のみを表示したWSDLフラグメント
... <xsd:import namespace="http://ws-i.org/profiles/basic/1.1/xsd" /> <xsd:complexType name="sendClaimType"> <xsd:sequence> <xsd:element name="id" type="xsd:string"/> <xsd:element name="claimDetail" type="ref:swaRef"/> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> ...
この項の内容は、次のとおりです。
SWA添付ファイルは、SOAP With Attachments(SWA)仕様に準拠する添付ファイルです。現在、WebServicesAssemblerでサポートされているのは、SWA
添付ファイルを含むWSDLファイルを使用したWebサービスのトップダウン方式のアセンブリのみです。SWA
MIMEパートは、WSDLの<wsdl:binding>
句で定義されています。添付ファイルは、対応するmime:part
のmime:content
要素によって定義されています。
例2-8に、mime:content
要素の形式、およびそのpart
とtype
属性を示します。part
属性は、添付ファイルが属するSOAPメッセージ部分を識別します。type
属性は、添付ファイルのコンテンツ・タイプを識別します。
例2-8 mime:content要素で参照されるSWA添付ファイル
<mime:part> <mime:content part="string" type="content type"/> </mime:part>
WebServicesAssemblerにより、WSDLファイルで検出される各mime:content
要素が処理され、MIMEコンテンツ・タイプに対応するJava型にマッピングされます。
表2-1に、MIMEコンテンツ・タイプと、それらがマッピングされる対応するJava型を表示します。認識されないMIMEコンテンツ・タイプのデフォルトの型はjavax.activation.DataHandler
です。
表2-1 SWA添付ファイルのコンテンツ・タイプのマッピング
コンテンツ・タイプ | Java型 |
---|---|
image/jpeg、image/gif、image/tif |
|
text/plain、application/plain |
|
text/xml |
|
次の手順では、SWA添付ファイルを処理できるサービス・エンドポイント・インタフェースを生成する方法を説明します。手順では、インタフェースのJavaクラスを表すコンテンツ・タイプの例として、JPGコンテンツを使用します。ただし、表2-1で説明するいずれのコンテンツ・タイプも使用できます。
SWA添付ファイルを表す各要素が、WSDLの<wsdl:binding...>
句の<mime:content...>
要素にあることを確認してください。
例2-9では、<mime:content...>
要素にphoto
JPEG添付ファイルがあります。
<mime:part> <mime:content part="photo" type="image/jpeg"/> </mime:part>
WSDLをWebServicesAssemblerのgenInterface
コマンドへの入力として使用します。次に、サンプルのgenInterface
コマンドを示します。
java -jar wsa.jar genInterface -wsdl mySwaWsdl -output c:\appDir
genInterface
コマンドにより、SWA
添付ファイルおよびWSDLの各complexType
のJavaクラスを表すパラメータを持つサービス・エンドポイント・インタフェースが生成されます。このJavaクラスは、SWA
添付ファイルのすべてのインスタンスで使用されます。
例2-10に、SWA添付ファイルをjava.awt.Image
Javaデータ型として表すパラメータ付きで生成されたサービス・エンドポイント・インタフェースを示します。
生成されたサービス・エンドポイント・インタフェースを実装します。
例2-9に、genInterface
への入力として使用できるSWA
参照を含むWSDLを示します。このWSDLの例では、簡略化するためにwsdl:service
要素が省略されていることに注意してください。
例2-9 SWA添付ファイルを参照するWSDL
<wsdl:definitions name="PhotoCatalogService" targetNamespace="http://examples.com/PhotoCatalog" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:types="http://examples.com/PhotoCatalog/types" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://examples.com/PhotoCatalog"> <wsdl:message name="addPhotoRequest"> <wsdl:part name="photo" type="xsd:hexBinary"/> </wsdl:message> <wsdl:message name="addPhotoResponse"> <wsdl:part name="status" type="xsd:string"/> </wsdl:message> <wsdl:message name="replacePhotoRequest"> <wsdl:part name="oldPhoto" type="xsd:string"/> <wsdl:part name="newPhoto" type="xsd:hexBinary"/> </wsdl:message> <wsdl:message name="replacePhotoResponse"> <wsdl:part name="status" type="xsd:string"/> </wsdl:message> <wsdl:portType name="PhotoCatalog"> <wsdl:operation name="addPhoto"> <wsdl:input message="tns:addPhotoRequest"/> <wsdl:output message="tns:addPhotoResponse"/> </wsdl:operation> <wsdl:operation name="replacePhoto"> <wsdl:input message="tns:replacePhotoRequest"/> <wsdl:output message="tns:replacePhotoResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="PhotoCatalogBinding" type="tns:PhotoCatalog"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="addPhoto"> <wsdl:input> <mime:multipartRelated> <mime:part> <soap:body use="literal"/> </mime:part> <mime:part> <mime:content part="photo" type="image/jpeg"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <mime:multipartRelated> <mime:part> <soap:body use="literal"/> </mime:part> <mime:part> <mime:content part="status" type="text/plain"/> <mime:content part="status" type="text/xml"/> </mime:part> </mime:multipartRelated> </wsdl:output> </wsdl:operation> <wsdl:operation name="replacePhoto"> <wsdl:input> <mime:multipartRelated> <mime:part> <soap:body parts="oldPhoto" use="literal"/> </mime:part> <mime:part> <mime:content part="newPhoto" type="image/jpeg"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <soap:body parts="status" use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions>
例2-9のWSDLの場合、WebServicesAssemblerのgenInterface
コマンドにより例2-10のインタフェースが生成されます。mime:content
がimage/jpeg
と定義されているため、photo
およびnewPhoto
パラメータはJavaデータ型java.awt.Image
を使用して生成されます。これで、インタフェースの実装で、JPEGファイルをphoto
部分の添付ファイルとして渡すことができます。これは、rpc-literalおよびdocument-literalでも同様です(wrappedおよびbare)。その操作にWSDLのmine:content
バインディングがあるため、addPhoto
メソッドの戻り値は、DataHandler
にマッピングされます。
この項では、SOAP障害メッセージへのMIMEタイプ添付ファイルの追加方法を説明します。この項の内容は、次のとおりです。
注意: OracleAS Web Servicesでは、SOAP障害メッセージに追加できるのはMIMEタイプ添付ファイルのみです。 |
SOAPでは、添付ファイルは、Webサービス実装クラスが例外をスローすると障害メッセージに追加されます。WS-I Attachments Profile 1.0では、WSDLの操作の出力メッセージに<mime:part>
要素がある場合にのみ、SOAP障害に添付ファイルを含めることができると指定されています。このため、添付ファイル付きの出力メッセージがあるWSDL操作にカスタム障害がある場合、WebServicesAssemblerにより障害で添付ファイルを処理する特別な例外クラスが生成されます。
例2-11のWSDLフラグメントに、操作でMIMEコンテンツを出力できることを宣言する<wsdl:operation>
句の<mime:part>
を示します。namespace
属性が必要なのは、rpc-literalメッセージを処理している場合のみです。このWSDLフラグメントには、操作でスローできる障害を定義する<wsdl:fault>
要素も示します。
例2-11 SOAP障害を定義するWSDLフラグメント
<wsdl:operation> ... <wsdl:output> <mime:multipartRelated> <mime:part> <soap:body parts="string" use="literal|encoded" [namespace="URL"]/> </mime:part> </mime:multipartRelated> </wsdl:output> <wsdl:fault name="string"> <soap:fault name="string" use="literal|encoded"/> </wsdl:fault> </wsdl:operation>
WebServicesAssemblerにより<wsdl:fault>
要素が処理されると、com.examples.types.
Fault_NameType
例外クラスが生成されます(例2-9で定義)。ここで、Fault_Nameはwsdl:fault
要素のname
属性の値です。
生成された障害クラスをスローするメソッドの実装には、そのクラスの新しいインスタンスの実装も含まれている必要があります。また、例外に添付ファイルを追加するコードも必要です。
添付ファイルを含むJavaクラスの作成および実装には、oracle.webservices.attachments
パッケージのクラスおよびメソッドの処理が含まれます。
注意: 添付ファイル付きの障害をWebサービスに追加できるのは、WebサービスをWSDLから(トップダウン方式で)アセンブルする場合にのみです。Webサービスをボトムアップ方式でアセンブルする場合は追加できません。 |
次に示す一般的な手順で、SOAP障害メッセージへの添付ファイルの追加方法と、それらの添付ファイルをサービス・エンドポイント・インタフェースに生成する方法を説明します。
処理するWSDLを用意します。
添付コンテンツ付きの障害をスローするWSDL操作を編集します。
<wsdl:output.../>
句に添付コンテンツを含む出力要素を宣言します。句には、<mime:multipartRelated>
コンテンツが含まれている必要があります。
<wsdl:fault.../>
要素を定義します。
「WSDLへの添付ファイル付きのSOAP障害の指定方法」には、wsdl:output
およびwsdl:fault
要素を含むように編集されたWSDLのサンプルが示されています。
WebServicesAssembler genInterface
コマンドを使用して、サービス・エンドポイント・インタフェースを生成します。
java -jar wsa.jar genInterface -wsdl myWsdl -output c:\appDir
添付データを使用するサービス・エンドポイント・インタフェースのメソッドには、attachment
データ型を取るパラメータがあります。メソッドは、oracle.webservices.attachments.AttachmentFault
を実装する例外をスローします。
インタフェースを実装します。
実装には、次のタスクを実行するコードを含めます。
oracle.webservices.attachments.AttachmentFault
を実装する例外の新しいインスタンスの作成
addAttachment
メソッドを使用した例外への添付ファイルの追加
「添付ファイル付きの障害をスローするメソッドの実装方法」に、例外の新しいインスタンスを作成し、それに添付ファイルを追加するサンプル・コードを示します。
インタフェースおよび実装のコンパイル、サービスのデプロイ、およびクライアント・コードのアセンブルを実行してください。
関連資料: Webサービスのアセンブルとデプロイおよびクライアント・コードの生成の手順の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WSDLからのWebサービスのアセンブル」を参照してください。 |
添付コンテンツをスローできるSOAP障害を指定するには、WSDL操作で次の属性を指定する必要があります。
添付コンテンツの名前空間。
障害メッセージの使用方法がliteralまたはencodedのいずれであるか。
障害が属するSOAPメッセージの部分。
WSDL障害自体で、名前とメッセージの使用方法がliteralとencodedのいずれであるかを特定する必要があります。<wsdl:fault>
句は、WSDL入力句およびWSDL出力句と同じレベルに記述されます。
例2-12に、wsdl:output
およびwsdl:fault
要素のあるreplacePhoto
バインディング操作のWSDLフラグメントを示します。wsdl:output
によりMIMEコンテンツが特定されているため、wsdl:fault
によって定義されている障害メッセージには添付ファイルを含めることができます。
例2-12 ポート・タイプおよびバインディングの宣言のみが表示されているWSDLフラグメント
<wsdl:operation name="replacePhoto"> <wsdl:input> <mime:multipartRelated> <mime:part> <soap:body parts="oldPhoto" use="literal" namespace="http://examples.com/PhotoCatalog"/> </mime:part> <mime:part> <mime:content part="newPhoto" type="image/jpeg"/> </mime:part> </mime:multipartRelated> </wsdl:input> <wsdl:output> <mime:multipartRelated> <mime:part> <soap:body parts="status" use="literal" namespace="http://examples.com/PhotoCatalog"/> </mime:part> </mime:multipartRelated> </wsdl:output> <wsdl:fault name="InvalidPhoto"> <soap:fault name="InvalidPhoto" use="literal"/> </wsdl:fault> </wsdl:operation>
添付コンテンツ付きの障害をスローできる、生成されたサービス・エンドポイント・インタフェースのメソッドには、attachmentデータ型を取るパラメータがあり、oracle.webservices.attachments.AttachmentFault
を実装する例外をスローします。メソッドの実装では、例外の新しいインスタンスを作成する必要があります。また、例外に添付ファイルを追加する必要もあります。oracle.webservices.attachments
パッケージにより、これを実行するFaultWithAttachments.addAttachment
メソッドが提供されます。
例2-13に、例2-12のWSDLフラグメントで定義されているreplacePhoto
操作の実装を示します。WSDLで定義されているInvalidPhoto
障害は、com.examples.types.InvalidPhotoType
例外クラスにマッピングされます。
replacePhoto
の実装は、必要に応じて、InvalidPhotoType
例外の新しいインスタンスを作成します。また、FaultWithAttachments.addAttachment
メソッドを使用して例外に添付ファイルを追加します。その後、InvalidPhotoType
は、添付ファイル付きのSOAP障害として転送される例外としてスローされます。
例2-13 添付ファイル付きの障害をスローするメソッドの実装
public AttachmentPart replacePhoto(PhotoInfoType oldPhoto, Image newPhoto) throws RemoteException,com.examples.types.InvalidPhotoType { if(newPhoto == null){ return null; } if(oldPhoto.getPhotoID() == -1){ InvalidPhotoType typeException = new InvalidPhotoType(-1,"InvalidPhotoType","The PhotoId specified is invalid"); try{ Image image = javax.imageio.ImageIO.read(new File("myImage")); typeException.addAttachment(image,"image/jpeg"); }catch(Exception e){ throw new RemoteException("unexpected exeption",e); } throw typeException; } AttachmentPart impl = null; try{ MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); impl = message.createAttachmentPart(); }catch(SOAPException ex){ return null; } return impl; }
J2SEまたはJ2EE Webサービス・クライアントは、サービスによってスローされる、添付ファイル付きのSOAP障害を取得するようコーディングできます。oracle.webservices.attachments
パッケージにより、障害から添付コンテンツを取得する際に使用できるメソッドが提供されます。たとえば、getAttachments
メソッドは、障害の添付ファイル・リストのイテレータの取得に使用できます。hasAttachments
メソッドは、障害に添付ファイルがあるかどうかを問い合せる際に使用できます。
例2-14に、添付コンテンツを取得できるクライアント・スタブphotoCatalog
を示します。この例では、oldPhoto
およびnewPhoto
パラメータがあらかじめ定義されており、InvalidPhotoType
例外によってoracle.webservices.attachments.AttachmentFault
が実装されることを仮定しています。InvalidPhotoType
によりAttachmentFault
が実装されるため、これは添付ファイルを含むことのできるSOAP障害です。
hasAttachments
メソッドは、障害に添付ファイルがあるかどうかを検証します。このメソッドによりtrue
が戻される場合、SOAP障害には添付ファイルがあります。getAttachments
メソッドは、SOAP障害のすべての添付ファイルを取得します。このメソッドは、SOAP障害の各添付ファイルのAttachmentPart
オブジェクトを含むイテレータを戻します。
例2-14 添付ファイル取得用のコードを持つWebサービス・クライアント
public class MyClientExample{ PhotoCatalog photoCatalog = getPhotoCatalogPortType(); //create a client stub for the web service try{ //assuming oldPhoto and newPhoto are defined photoCatalog.replacePhoto(oldPhoto, newPhoto); // assuming InvalidPhotoType implements AttachmentFault }catch(InvalidPhotoType type){ if(type.hasAttachments()){ java.util.Iterator it = type.getAttachments(); AttachmentPart p = (AttachmentPart)it.next(); //do something useful with the attachment. } }
この項の内容は、次のとおりです。
OracleAS Web Servicesを使用すると、大きな添付ファイルをストリーミング形式で渡すことができます。添付ファイルをすべてメモリーにマテリアライズする必要があるJAX-RPC APIとは対照的に、ストリーミング形式ではプログラミング・モデルをより効率的に使用できるようになります。また、ストリーミング添付ファイルでは、サービスの実行前にすべての添付ファイルをメモリーにロードする必要がないため、パフォーマンスや拡張性も向上します。
ストリーム添付ファイルは、埋込み添付ファイル同様、MIMEマルチパートのバイナリ形式に準拠しています。ワイヤ書式では、ストリーム添付ファイル付きのメッセージは、添付ファイル付きのその他のSOAPメッセージと同じです。
例2-15に、ストリーム添付ファイル付きのサンプル・メッセージを示します。メッセージの1つ目の部分は、SOAPエンベロープ(<SOAP-ENV:Envelope...
)です。2つ目の部分が添付ファイルで、この場合はmyImage.gif
です。
例2-15 ストリーム添付ファイル付きのサンプル・メッセージ
MIME-Version: 1.0 Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml; Content-Description: This is the optional message description. --MIME_boundary Content-Type: text/xml; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-ID: NotSure/DoesntMatter <?xml version='1.0' ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> .. <DocumentName>MyImage.gif</DocumentName> .. </SOAP-ENV:Body> </SOAP-ENV:Envelope> --MIME_boundary Content-Type: image/gif Content-Transfer-Encoding: binary Content-ID: AnythingYoudLike ...binary GIF image... --MIME_boundary--
添付ファイルAPIには、ストリーミング添付ファイルのためのプログラム・インタフェースがあります。ストリーム添付ファイルには方向があり、受信(サービス・リクエストまたはクライアント・レスポンス)と発信(サービス・レスポンスまたはクライアント・リクエスト)に分類できます。受信ストリームは読み取ることしかできず、発信ストリームは書き込むことしかできません。
ストリーミングは、添付ファイルをストリーミングする各サービスまたはスタブ操作に特別なパラメータを追加することで有効化できます。このパラメータはAttachments
型(oracle.webservices.attachments.Attachments
)である必要があります。Attachments
インタフェースにより、受信添付ファイルのストリームを読み取るためのメソッドや、発信添付ファイルのストリームを追加するためのメソッドが提供されます。
APIはoracle.webservices.attachments
パッケージに存在します。表2-2に、添付ファイルAPIのインタフェースおよびクラスをまとめます。表以降の項で詳細を説明します。
表2-2 添付ファイルAPIのインタフェース
インタフェースまたはクラス | 説明 |
---|---|
|
|
|
このファクトリ・クラスは、 |
|
添付ファイルを管理するルート・インタフェースです。このインタフェースには、添付ファイルを受信または発信添付ファイルとして保存するためのメソッドが含まれます。詳細は、「添付ファイル用のインタフェース」を参照してください。 |
|
受信添付ファイルを処理するイテレータを提供します。サーバー上のリクエスト添付ファイル、またはクライアント上のレスポンス添付ファイルのいずれかです。詳細は、「受信添付ファイル用のインタフェース」を参照してください。 |
|
メッセージのシリアライズ後に、ストリーミングする発信添付ファイルを収集します。クライアント上のリクエスト添付ファイル、またはサーバー上のレスポンス添付ファイルのいずれかです。詳細は、「発信添付ファイル用のインタフェース」を参照してください。 |
Attachment
オブジェクトは、添付ファイルを識別するためのString
IDと、データを取得するためのデータ・ハンドラで構成されています。出力ストリームに添付ファイルを追加するために、OutgoingAttachments
インタフェースのaddAttachment
メソッドで使用されます。
interface Attachment { public String getId(); public DataHandler getDataHandler(); }
パッケージにより、Attachments
およびAttachment
オブジェクトのインスタンスを作成するためのファクトリ・クラスが提供されます。スタブでストリーミング添付ファイルを使用している場合は、サービスをコールする前にAttachments
オブジェクトを作成する必要があります。
abstract class AttachmentFactory { public Attachments createAttachments(); public Attachment createAttachment (String id, String contentType, InputStream attachmentStream); public Attachment createAttachment (String id, DataHandler handler); public static AttachmentFactory newInstance(); }
Attachments
は、添付ファイルを管理するルート・インタフェースです。getIncomingAttachments
メソッドは、IncomingAttachments
オブジェクトを戻します。受信添付ファイルがない場合には、null
を戻します。getOutgoingAttachments
メソッドは、常にOutgoingAttachments
オブジェクトを戻します。
public interface Attachments { IncomingAttachments getIncomingAttachments(); OutgoingAttachments getOutgoingAttachments(); }
IncomingAttachments
インタフェースは、サーバー上のリクエスト添付ファイル、およびクライアント上のレスポンス添付ファイルに使用されます。基本的に、添付ファイル全体のイテレータです。インタフェースには、残っている添付ファイルをストリームからフラッシュするようランタイムに伝達するclose
メソッドが含まれます。次のリクエスト用に接続が消去されるよう、このメソッドはすべての添付ファイルが処理された後にコールする必要があります。
interface IncomingAttachments { public boolean hasNextAttachment() throws IOException; public Attachment nextAttachment() throws IOException; public void close() throws IOException; }
OutgoingAttachments
インタフェースは、クライアント上のリクエスト添付ファイル、およびサーバー上のレスポンス添付ファイルに使用されます。メッセージのシリアライズ後に、ストリーミングする添付ファイルを収集します。インタフェースには、出力ストリームに添付ファイルを追加するためのaddAttachment
メソッドが含まれます。「添付オブジェクト用のファクトリ・クラス」で説明されているメソッドを使用して添付ファイルを作成できます。
interface OutgoingAttachments { public void addAttachment (Attachment attachment); }
ストリーミング添付ファイルでは、WSDL拡張である<stream-attachments>
を使用して、添付データがストリーミングされることをWebServicesAssemblerツールに通知します。要素は必須の文字列属性name
を、生成されるJavaクラスおよびインタフェースに対するパラメータ名として取ります。要素は次のOracle名前空間に指定されます。
http://oracle.com/schemas/webservices/streaming-attachments
要素を使用できるのは、バインディング操作レベルにおいてのみです。
<stream-attachments>
要素を含むWSDLは、例2-19で説明されています。例2-16に、<stream-attachments>
スキーマを示します。
例2-16 ストリーミング添付ファイルのXMLスキーマ
<schema xmlns="http://www.w3.org/2000/10/XMLSchema" xmlns:sa="http://oracle.com/schemas/webservices/streaming-attachments" targetNamespace="http://oracle.com/schemas/webservices/streaming-attachments"> <element name="stream-attachments" type="sa:streamAttachemntsType"/> <complexType name="streamAttachemntsType"> <attribute name="name" type="string" use="required"/> </complexType> </schema>
この項では、ストリーミング添付ファイルを使用するWebサービスのアセンブル方法を説明します。
ストリーミング添付ファイルをサポートするWebサービスをボトムアップ方式でアセンブルするモデルは、Javaクラスに基づくその他のサービスと同じです。Javaクラスを使用したボトムアップ方式によるWebサービスのアセンブルの詳細は、『Oracle Application Server Web Services開発者ガイド』の「Javaクラスを使用したWebサービスのアセンブル」を参照してください。
サービスとして公開するリモート・メソッドが含まれるパブリック・インタフェースを作成します。この場合、1つ以上のメソッドに添付ファイルAPIが使用されます。
この手順の詳細は、「ストリーミング添付ファイルのインタフェースの作成方法」で説明されています。
サービスの実装を作成します。
この手順の詳細は、「ストリーミング添付ファイルを使用するサービス・インタフェースの実装方法」で説明されています。
Webサービス・クライアントのスタブ・コードを作成します。添付ファイルの送信または受信にスタブを使用するには、コール前にAttachments
オブジェクトを作成する必要があります。
この手順の詳細は、「ストリーミング添付ファイルを処理するスタブ・コードの作成方法」で説明されています。
assemble
コマンドを使用してWebServicesAssemblerを実行し、サービスのアーティファクトを生成します。
生成されたWSDLのサンプルは、「ストリーミング添付ファイル付きのサービスの生成されたWSDLのサンプル」で説明されています。
サービスをデプロイし、アプリケーションをバインドします。
クライアント・サイド・コードを生成します。
クライアントをコンパイルおよび実行します。
Webサービスの一部として添付ファイルをストリーミングする場合は、サービス・インタフェースの少なくとも1つのメソッドにAttachments
型(oracle.webservices.attachments.Attachments
)のパラメータが含まれている必要があります。Attachments
型は、OracleAS Web Servicesによってオブジェクトがストリーミングされることを示します。
例2-17に、ローカル・データベースに大きな画像ファイルを保存するWebサービスのサービス・インタフェースを示します。リクエストには、画像名、説明および保存される画像が含まれます。Attachments
型のattachments
パラメータにより、画像がストリーミングされることが示されています。
例2-17 ストリーミング添付ファイルを使用するサービス
public interface ImageStore extends java.rmi.Remote {
public void storeImage (String name, String desc, Attachments attachments) throws java.rmi.RemoteException;
}
このインタフェースを使用してボトムアップ方式でWebサービスを生成すると、WebServicesAssemblerによりAttachments
型のパラメータが検出されます。ストリーミング添付ファイルのサポートが、自動的にWebサービスに生成されます。
ストリーミング添付ファイルとしてデータを含むインタフェースの実装では、添付データを処理するoracle.webservices.attachments
APIのメソッドおよびクラスが使用されます。
例2-18に、例2-17に示されている、ローカル・データベースに大きな画像ファイルを保存するWebサービスのインタフェースの実装を示します。実装では、getIncomingAttachments
メソッドを使用して、受信ストリーミング添付ファイルをAttachment
オブジェクトとして取得しています。getId
メソッドは添付ファイルのメタデータを取得し、getInputStream
はストリーム画像バイトを保存します。
例2-18 ストリーミング添付ファイルを使用するサービス実装
class ImageStoreImpl { public void storeImage(String name, String desc, Attachments attachments) throws Exception { IncomingAttachments incomingAtts = attachments.getIncomingAttachments(); { if (incomingAtts == null || !incomingAtts.hasNextAttachment()) throw new Exception("Expected request attachments"); Attachment imageAtt = incomingAtts.nextAttachment(); String id = imageAtt.getId(); DataHandler dataHandler = imageAtt.getDataHandler(); InputStream imageStream = dataHandler.getInputStream(); //-- Store image metadata and stream image bytes if (incomingAtts.hasNextAttachment()) throw new Exception("Expected only one attachment"); } } }
例2-19に、WebServicesAssemblerにより例2-17のインタフェースから生成されるWSDLの関連部分を示します。WSDLに<stream-attachments>
拡張がある場合、そのWebサービスはストリーミング添付ファイルをサポートしています。
例2-19 ストリーミング添付ファイルのWSDL要素
<message name="storeImageRequest">
<part name="name" type="string"/>
<part name="desc" type="string"/>
</message>
<portType name="ImageStorePortType">
<operation name="storeImage">
<input name="storeImageRequest" message="tns:storeImageRequest"/>
<output name="storeImageResponse" message="tns:storeImageResponse"/>
</operation>
</portType>
<binding name="ImageStoreBinding" type="tns:ImageStorePortType">
<soap:binding style="rpc" />
<operation name="addPerson">
<soap:operation style="encoded" wsdl:required="true" />
<sa:stream-attachments name="attachments" />
<input name="storeImageRequest">
<soap:body use="encoded" />
</input>
<output name="storeImageResponse">
<soap:body use="encoded" />
</output>
</operation>
</binding>
スタブは、Webサービスのクライアント・サイドです。サービスでストリーム添付ファイルを受信する場合は、クライアントから送信する必要があります。サービスがストリーム添付ファイルを送信する場合は、クライアントで読み取る必要があります。
ストリーミング添付ファイルを処理するには、AttachementFactory
の新しいインスタンスおよびAttachments
オブジェクトを、クライアント・コードで作成する必要があります。リクエスト添付ファイルの場合は、addAttachment
メソッドを使用して出力ストリームに添付ファイルを追加できます。
レスポンス添付ファイルの場合は、AttachementFactory
の新しいインスタンスおよびAttachments
オブジェクトを、クライアント・コードで作成する必要があります。クライアントは、IncomingAttachments
インタフェースのイテレータ・メソッドを使用して添付ファイルを取得できます。
例2-20に、ストリーミング添付ファイルを保存するスタブ・コードを示します。この例では、newInstance
メソッドを使用してAttachmentFactory
が初期化され、createAttachments
メソッドを使用してAttachments
オブジェクトが作成されています。addAttachment
メソッドにより、出力ストリームにデータが追加されます。
例2-20 ストリーミング添付ファイルを保存するクライアント・コード
public void storeImageFile (String fileName) { //-- Create the attachment objects AttachmentFactory factory = AttachmentFactory.newInstance(); Attachments atts = factory.createAttachments(); Attachment imageAtt = factory.createAttachment (fileName, "image/gif", new FileInputStream(fileName)); atts.getOutgoingAttachments().addAttachment(imageAtt); storeImagePort.storeImage (fileName, "File stored at " + fileName, atts); }
ストリーミング添付ファイルをサポートするWebサービスは、『Oracle Application Server Web Services開発者ガイド』の「WSDLからのWebサービスのアセンブル」で説明されている一般的な手順に従ってアセンブルします。この項では、その手順をまとめます。
ストリーミング添付ファイルをサポートするには、WSDLも編集して<stream-attachments>
要素を追加する必要があります。<stream-attachments>
要素を含むWSDLは、例2-19で説明されています。
Webサービスを生成するWSDLを用意します。
WSDLを編集して、Webサービスにおけるストリーミング添付ファイルのサポートを可能にする要素を追加します。
<stream-attachments>
要素およびそのスキーマの詳細は、「ストリーミング添付ファイルのWSDL拡張」で説明されています。
WSDLをWebServicesAssemblerのgenInterface
コマンドへの入力として使用します。
生成されたインタフェースおよびタイプ・クラスをコンパイルします。
作成するWebサービスのJavaサービス・エンドポイント・インタフェースを作成します。
Javaサービス・エンドポイント・インタフェースをコンパイルします。
WebServicesAssemblerツールのtopDownAssemble
コマンドを実行し、サービスを生成します。
サービスをデプロイします。
クライアント・コードを生成します。
現行リリースでは、OracleAS Webサービスおよびクライアントには、MTOM、MIMEおよびDIME書式でエンコードされたメッセージを処理する機能があります。MTOM(SOAP Message Transmission Optimization Mechanism)エンコーディングにより、バイナリ・コンテンツをクライアントとサービス間で効率よく渡せるようになります。
この項の内容は、次のとおりです。
JPEG書式の画像などのバイナリ・コンテンツを、クライアントとサービス間で渡すことができます。通常、バイナリ・コンテンツを渡すためには、XMLドキュメントにxsd:base64Binary
文字列として挿入します。この書式でバイナリ・コンテンツを送信すると、伝送中の送信メッセージのサイズが大きくなり、処理に要する空間と時間の点でコストが高くなります。
MTOMを使用すると、バイナリ・コンテンツはMIME添付ファイルで送信されるため、ワイヤ書式の送信サイズを小さくできます。バイナリ・コンテンツは、意味上はXMLドキュメントの一部です。メッセージ上のWS-Security署名などの操作を適用できる点で、SWA(添付ファイル付きのSOAPメッセージ)より優れています。
MTOMを使用してバイナリ・コンテンツを添付ファイルとして渡すと、Webサービス・スタックのパフォーマンスが向上します。MTOM-encodedメッセージにバイナリ・コンテンツが含まれない場合、パフォーマンスには影響はありません。相互運用性を向上させるために、バイナリ・コンテンツを含まないメッセージにはMTOMエンコードを使用しないでください。
MTOMでは、XMLスキーマ型xs:base64Binary
の要素を含んだエンベロープのあるSOAP 1.2メッセージの送信メカニズムが最適化されます。次の仕様に記述されるデータ処理メカニズムをMTOMは利用します。
XOP(XML-binary Optimized Packaging): コンテンツ型xs:base64Binary
を持つXML Infosetsをより効率的にシリアライズするメカニズムを提供します。
DMCBDX(Describing Media Content of Binary Data in XML): コンテンツ型情報をXMLインスタンスおよびスキーマのバイナリ・データに提供します。この情報を使用して、バイナリ・データの処理を最適化できます。
RRSHB(Resource Representation SOAP Header Block): SOAPメッセージを使用して、JPEG画像などのWebリソースの表現をSOAPヘッダー・ブロックに保持できます。MTOMおよびXOPと組み合せると、RRSHB SOAPヘッダー・ブロックに含まれるWebリソースを、SOAPヘッダー内のxs:base64Binary
ではなく未処理のバイナリMIME添付ファイルとして送信できます。
これらの仕様は、OSUCR(SOAP Optimized Serialization Use Cases and Requirements)で説明されている要件を満たしています。
関連資料: この項で説明する仕様の詳細は、次のWebサイトを参照してください。
|
WebServicesAssemblerツールを使用して、MTOMエンコード添付ファイルに対するサポートをWebサービスおよびクライアントに追加できます。このためには、true
に設定されたブール型属性mtomSupport
を、トップダウン方式、ボトムアップ方式またはクライアントWebサービスのアセンブリでWebServicesAssembler Antターゲット内に含めてください。
mtomSupport
属性は、WebServicesAssembler topDownAssemble
、assemble
およびgenProxy
Antタスクでのみ使用できます。コマンドラインでは使用できません。
Javaクラスに基づくWebサービスへのMTOMエンコード添付ファイルのサポートのアセンブルは、他のいずれのJavaクラスを使用したアセンブルと同様です。Javaクラスがバイナリ・データを処理し、mtomSupport
属性をassemble
Antタスクに追加する点のみが異なります。
関連資料:
|
この項の例では、次のJavaインタフェースおよびクラス・ファイルのメソッドをWebサービスとして公開することを仮定しています。
例2-21に、Webサービスとして公開されるメソッドを含むJavaインタフェースMtomBottomupSEI
を示します。このインタフェースには、byte[]
配列を入力として受け入れるメソッドがあり、同じバイト配列を戻すことに注意してください。
例2-21 Webサービスとして公開されるJavaインタフェース
public interface MtomBottomupSEI extends Remote{ public byte[] echoBase64Binary(byte[] text) throws RemoteException; }
例2-22に、JavaクラスMtomBottomupImpl
、Webサービスとして公開されるインタフェースの実装を示します。
例2-22 Webサービスとして公開されるJavaクラス
public class MtomBottomupImpl { public byte[] echoBase64Binary(byte[] text) { return text; } }
assemble
Antタスクを使用してWebServicesAssemblerを実行し、Webサービスのアーティファクトを生成できます。次のタスクは、SOAP 1.2およびSOAP 1.1のための2つのポートに対してインタフェースおよびクラスを公開します。SOAP 1.2のポート仕様では、mtomSupport
が有効です。コンパイル済の実装およびクラス・ファイルは、mtom-bottomup-impl.jar
にあります。
<oracle:assemble appName="mtom-bottomup" serviceName="mtom-bottomup" input="mtom-bottomup-impl.jar" style="rpc" use="literal" ear="mtom-bottomup.ear" > <oracle:porttype interfaceName="mtom.service.MtomBottomupSEI" className="mtom.service.MtomBottomupImpl" > <oracle:port soapVersion="1.2" uri="MtomBottomupPort" name="MtomBottomupPort" mtomSupport="true"/> <oracle:port soapVersion="1.1" uri="MtomBottomupPortSoap11" name="MtomBottomupPortSoap11" /> </oracle:porttype> </oracle:assemble>
例2-23に、このWebサービス用に生成されたWSDLの部分を示します。バイト配列は、前述と同様にxsd:base64Binary
にマッピングされることに注意してください。MTOMのWSDLまたはスキーマ拡張はありません。
例2-23 MTOMエンコード添付ファイルをサポートするWebサービスのWSDLフラグメント
... <message name="MtomBottomupSEI_echoBase64Binary"> <part name="text" type="xsd:base64Binary"/> </message> <message name="MtomBottomupSEI_echoBase64BinaryResponse"> <part name="result" type="xsd:base64Binary"/> </message> ...
例2-24に、Webサービスに対して生成されたoracle-webservices.xml
デプロイメント・ディスクリプタの部分を示します。MtomBottomupPort
のポート定義には、行<mtom-support>true</mtom-support>
が含まれますが、もう1つのポートMtomBottomupPortSoap11
には含まれないことに注意してください。<mtom-support>
要素のデフォルト値は、false
です。
例2-24 MTOMエンコード・Webサービスのoracle-webservices.xmlフラグメント
... <port-component name="MtomBottomupPort"> <mtom-support>true</mtom-support> <operations> <operation name="echoBase64Binary" input="{http://mtom.service/}echoBase64Binary"/> </operations> </port-component> <port-component name="MtomBottomupPortSoap11"> <operations> <operation name="echoBase64Binary" input="{http://mtom.service/}echoBase64Binary"/> </operations> </port-component> ...
トップダウン方式によるWebサービスへのMTOMエンコード添付ファイルのサポートのアセンブルは、他のトップダウン方式でのアセンブルと同様です。バイナリ・データを処理するWSDLドキュメントが記述され、mtomSupport
属性をtopDownAssemble
Antタスクに追加する点のみが異なります。
関連資料:
|
たとえば、バイナリ・データを処理するWSDLが、genInterface
Antタスクへの入力としてすでに指定されていると仮定します。また、Antタスクで生成されたサービス・エンドポイント・インタフェースが実装済およびコンパイル済であるとします。
次のtopDownAssemble
Antタスクの例では、Webサービス・アーティファクトはecho-service.wsdl
ファイル(例2-25に示します)からアセンブルされ、echo-service.ear
ファイルに保存されます。mtomSupport
属性は、EchoTestPort
の定義に設定され、MTOMエンコードのバイナリ添付ファイルをそのポートを通じて渡せるようになります。
<oracle:topDownAssemble appName="mtom-echo-service" wsdl="echo-service.wsdl" ear=" echo-service.ear"> <oracle:portType name="EchoTestPortType" className="mtom.service.EchoTestImpl" classFileName="src/mtom/service/EchoTestImpl.java"> <oracle:port uri="/EchoTestPort" name="EchoTestPort" mtomSupport="true"> </oracle:port> </oracle:topDownAssemble>
このAntタスクでは、次のメソッドをサービス・エンドポイント・インタフェースに作成します。
... public byte[] echoPicture(byte[] picture); ...
次のMTOM構成がoracle-webservices.xml
デプロイメント・ディスクリプタに生成されます。
<mtom-support>true</mtom-support>
例2-25に、echo-service.wsdl
ファイルのフラグメントを示します。WSDLでは、xs:base64Binary
リクエストを受け入れ、xs:base64Binary
レスポンスを戻す単一の操作を含む単一のportType
を定義します。ワイヤ書式では、MTOMが有効な場合、xs:base64Binary
コンテンツはバイナリ書式のMIME添付ファイル部分にあります。
例2-25 バイナリ・データを処理するWSDLのサンプル
... <wsdl:message name="echo-picture-Request"> <wsdl:part name="picture" type="xsd:base64Binary"/> </wsdl:message> <wsdl:message name="echo-picture-Response"> <wsdl:part name="picture" type="xsd:base64Binary"/> </wsdl:message> <wsdl:portType name="echo-servicePortType"> <wsdl:operation name="echo-picture"> <wsdl:input message="tns:echo-picture-Request"/> <wsdl:output message="tns:echo-picture-Response"/> </wsdl:operation> </wsdl:portType> ...
クライアント・プロキシによるWebサービスへのMTOMエンコード添付ファイルのサポートのアセンブルは、他のクライアント・プロキシのアセンブルと同様です。クライアント・コードがバイナリ・データを処理し、mtomSupport
属性をgenProxy
Antタスクに追加する点のみが異なります。
関連資料:
|
次のgenProxy
Antタスクの例では、クライアント・スタブはecho-service.wsdl
ファイル(例2-25に示します)を使用してアセンブルされます。mtomSupport
属性は、EchoPort
ポートの定義でtrue
に設定します。これにより、MTOMが有効なプロキシが生成され、関連するコンテンツを含むリクエスト・メッセージはMTOM書式でエンコードされたEchoPort
を使用して送信されます。
...
<oracle:genProxy wsdl="echo-service.wsdl">
<oracle:port name="EchoPort" mtomSupport="true"/>
</oracle:genProxy>
...
oracle.webservices.ClientConstants
クラスのブール型プロパティMTOM_SUPPORT
を使用すると、クライアントのMTOMのサポートを有効または無効にできます。このプロパティにより、クライアント・スタブでリクエストをMTOM/XOPエンコーディングでパッケージ化するかどうか指定できます。MTOM_SUPPORT
プロパティの使用方法の例は、「静的スタブおよび動的プロキシでMTOMエンコード添付ファイルを渡す方法」で説明されています。
次の項では、Oracle実装のSOAP with Attachments API for Java(OraSAAJ)を使用してMTOMエンコード添付ファイルを処理する方法を説明しています。
OraSAAJ APIにより、クライアントおよびサービスをMTOMエンコード書式のバイナリ添付ファイルを処理するメソッドおよびプロパティが使用可能になります。このメソッドおよびプロパティは次の項で説明します。
oracle.webservices.ClientConstants
クラスにより、クライアント・スタブでリクエストをMTOM/XOPエンコーディングでパッケージ化するかどうか指定できるブール型プロパティMTOM_SUPPORT
が提供されます。このプロパティは、リクエストを送信するポートに設定します。
public static final String MTOM_SUPPORT="oracle.webservices.mtomSupport";
プロパティの値をtrue
に設定すると、リクエストはMTOM/XOP書式でエンコードされます。デフォルトはfalse
です。
oracle.j2ee.ws.saaj.soap.MessageImpl
抽象クラスは、javax.xml.soap.SOAPMessage
クラスのOracle独自の拡張機能です。これ以外の機能として、MessageImpl
クラスにより、メッセージをシリアライズするエンコーディング書式を示すPACKAGING_STYLE
およびATTACHMENT_STYLE_PACKAGING
プロパティが提供されます。
public abstract class MessageImpl extends SOAPMessage { ... public static final String ATTACHMENT_STYLE_PACKAGING="AttachmentStylePackaging"; public static final String PACKAGING_STYLE = "PackagingStyle"; public static final String MTOM = "MTOM"; public static final String DIME = "DIME"; public static final String MIME = "MIME"; ...}
Oracle独自のMessagImpl.PACKAGING_STYLE
プロパティにより、メッセージを様々なエンコーディング書式にシリアライズできます。エンコーディング書式はSOAPMessage
オブジェクトに適用されます。MessageImpl.PACKAGING_STYLE
には、次の値が可能です。
MessageImpl.MTOM
: SOAPMessage
をMTOM書式にシリアライズします。
MessageImpl.MIME
: (デフォルト)SOAPMessage
をMIME書式にシリアライズします。
MessageImpl.DIME
: SOAPMessage
をDIME書式にシリアライズします。
次の例では、関連するコンテンツを含む場合、request
メッセージをMTOM書式でエンコードします。
...
request.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MTOM);
...
関連資料:
|
MessageImpl.ATTACHMENT_STYLE_PACKAGING
ブール型プロパティにより、MessageImpl.PACKAGING_STYLE
プロパティで指定したエンコーディングのスタイルを強制的にメッセージに使用できます。MessageImpl.ATTACHMENT_STYLE_PACKAGING
プロパティがtrue
に設定されている場合、関連するコンテンツを含まない場合でも、MessageImpl.PACKAGING_STYLE
により指定される書式でメッセージをエンコードします。このプロパティのデフォルト値はfalse
です。
たとえば、次のコード・サンプルでは、メッセージmsg
のコンテンツは強制的にMTOM書式でエンコードされます。
...
msg.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MTOM);
msg.setProperty(MessageImpl.ATTACHMENT_STYLE_PACKAGING, "true");
...
MessageImpl.ATTACHMENT_STYLE_PACKAGING
プロパティがtrue
で、MessageImpl.PACKAGING_STYLE
プロパティが存在しない場合、メッセージはMIME書式(MessageImpl.PACKAGING_STYLE
のデフォルト値)でエンコードされます。
表2-3では、MessageImpl.ATTACHMENT_STYLE_PACKAGING
プロパティをMessageImpl.PACKAGING_STYLE
で使用する場合の、予期される出力を示します。
表2-3 様々なPACKAGING_STYLEおよびATTACHMENT STYLE_PACKAGING値のメッセージ書式の結果
PACKAGING_STYLEプロパティ値 | ATTACHMENT_STYLE_PACKAGINGプロパティ値 | メッセージ書式 |
---|---|---|
存在しないまたはMTOM |
存在しない(デフォルト)または |
|
MIME |
存在しない(デフォルト)または |
|
DIME |
存在しない(デフォルト)または |
|
MTOM |
|
ユーザーはメッセージをMTOM書式で受信します。 |
MIME |
|
ユーザーはメッセージをMIME書式で受信します。 |
DIME |
|
ユーザーはメッセージをDIME書式で受信します。 |
存在しない |
|
ユーザーはメッセージをMIME書式で受信します。 |
oracle.webservices.soap.OracleSOAPElement
インタフェースは、javax.xml.soap.SOAPMessage
インタフェースのOracle独自の拡張機能です。インタフェースには、バイナリ・コンテンツの添付ファイル(MTOM/XOP)を処理するメソッドが含まれます。
このインタフェースには次のシグネチャがあります。
public interface OracleSOAPElement extends SOAPElement{ public DataHandler getDataHandler() throws SOAPException; public void setDataHandler(DataHandler datahandler);
注意: バイナリ・コンテンツに直接アクセスしない場合、OracleSOAPElement APIを使用する必要はありません。DOMまたはSAAJ APIを使用すると、MTOMエンコーディングのバイナリ・コンテンツに他のメッセージ・コンテンツと同様にアクセスできます。
たとえば、DOMまたSAAJ APIを使用している場合にMTOMエンコード添付ファイル付きでメッセージを受信したとします。 |
setDataHandler
メソッドにより、指定されたDataHandler
オブジェクトはこのOracleSOAPElement
オブジェクトのデータ・ハンドラに設定されます。通常、データ・ハンドラは自動的に受信メッセージに設定されます。メッセージが作成され、コンテンツに移入されると、setDatahandler
メソッドは様々なデータソースから情報を取得し、それらをメッセージに追加します。
この要素を含むSOAPMessage
をMTOM/XOP書式にシリアライズすると、MIME部分がこのDataHandler
から作成されます。SOAPMessage
を他の書式にシリアライズすると、DataHandler
から読み取られたバイトは、base-64文字列にエンコードされてOracleSOAPElement
の唯一の子に設定されます。
データ・ハンドラが無効の場合、setDataHandler
メソッドはIllegalArgumentException
をスローします。
関連資料:
|
getDataHandler
メソッドは、OracleSOAPElement
オブジェクトに関連付けられるMTOM/XOP添付ファイルを使用して作成するDataHandler
オブジェクトまたはbase-64バイナリ書式のテキストのいずれかを戻します。
このメソッドでは、要素はxsd:base64Binary
型で、ネイティブbase-64文字列の形式またはMTOM/XOP添付ファイルの形式のいずれかであると仮定します。それ以外の要素の型でこのメソッドをコールした場合、結果は未定義です。このメソッドは、関連するSOAPMessage
がMTOM/XOP書式でパッケージ化されているかどうかにかかわらずコールできます。
この条件が満たされない場合、getDataHandler
メソッドはSOAPException
をスローします。たとえば、OracleSOAPElement
オブジェクトにデータがない、または子要素がある場合、例外がスローされます。
この項では、Oracle拡張SAAJ(OraSAAJ)APIを、クライアント・コードのバイナリ・コンテンツの添付ファイルで使用する方法を説明します。この拡張により、WebサービスでSOAP 1.2メッセージを処理できます。
Webサービス・クライアントがMTOMエンコード・リクエストを送信する機能を有効化または無効化するため、OraSAAJ APIにはoracle.webservices.ClientConstants
パッケージにブール型プロパティMTOM_SUPPORT
が用意されています。
public static final String MTOM_SUPPORT = "oracle.webservices.mtomSupport";
このプロパティをメッセージを送信するポートに設定してください。プロパティをtrue
に設定すると、ポートから送信するすべてのメッセージはMTOM/XOP書式でエンコードされます。デフォルトはfalse
です。
プロパティは、MTOMエンコード・リクエストを送信するためにアセンブルされたクライアントのMTOMサポートを上書きする、またはMTOMなしでアセンブルされたクライアントのサポートを有効にするクライアント・コードで使用できます。
関連資料:
|
例2-26に、静的スタブ・クライアント・コードのフラグメントを示します。ここでは、最初はクライアントをMTOMサポートなしでアセンブルしたとします。コード・フラグメントでは、MTOM_SUPPORT
プロパティはクライアントを起動する前にEchoPort
ポートに設定されます。EchoPort
ポートから送信するすべてのメッセージは、MTOMエンコード書式です。
例2-26 静的スタブ・クライアント・コードのMTOM_SUPPORTプロパティ
...
//obtain the service from the ServiceFactory
ServiceFactory serviceFactory = ServiceFactory.newInstance();
EchoService service = (EchoService)serviceFactory.createService(null, EchoService.class);
// get the port
Object port = service.getEchoPort();
// enable MTOM support
((OracleStub)port).setProperty(MTOM_SUPPORT, "true");
// invoke the stub
byte[] response = ((EchoPort)port).echoPicture(new byte[picture]);
...
J2EEクライアントでは、ブール型プロパティ
oracle.webservices.mtomSupport
をいずれかのOracle独自のクライアント・デプロイメント・ディスクリプタ・ファイルでtrue
に設定してMTOMエンコード・コンテンツの添付ファイルを渡すことができます。次のファイルを使用します。
orion-web.xml
: Webクライアント用
orion-ejb-jar.xml
: EJBクライアント用
orion-application-client.xml
: アプリケーション・クライアント用
J2EEクライアントをMTOMサポートに対応させるには、<service-ref-mapping>
句のスタブ・プロパティとして、デプロイメント・ディスクリプタ・ファイルにプロパティを入力します。
例2-27に、クライアントがMTOMエンコード書式でリクエストを送信できるorion*
ファイルの構成サンプルを示します。サンプルでは、service_name
はWebサービスのサービス名を表します。
SOAPConnection
オブジェクトは、Webサービス・クライアントがURLなどのリモート・パーティへのメッセージの送信に使用できるポイントツーポイント接続を確立します。このタイプの接続にはメッセージ・プロバイダは必要ありません。このため、SOAPConnection
をOraSAAJで直接使用するクライアントでは、SOAPConnection.call
メソッドのコール前にリクエストSOAPMessage
を適切な書式にシリアライズする必要があります。
Oracle独自のMessagImpl.PACKAGING_STYLE
プロパティをSOAPMessage
に適用して、メッセージをシリアライズします。プロパティ値は、メッセージをシリアライズする書式を示します。MessageImpl.PACKAGING_STYLE
には、次の値が可能です。
MessageImpl.PACKAGING_STYLE
プロパティは、関連するコンテンツが存在する場合のみ、指定したエンコードでメッセージを生成します。コンテンツが提供されない場合、メッセージは予期しない書式になります。メッセージを強制的に特定のエンコーディングにする方法の詳細は、次の項の「メッセージ強制エンコーディングの方法」を参照してください。
例2-28に、MessageImpl.PACKAGING_STYLE
プロパティの使用方法を示します。コード・サンプルでは、型SOAPMessage
のrequest
を作成します。バイナリ・コンテンツをリクエスト・メッセージに追加した後に、setProperty
メソッドはメッセージをどのエンコーディングにシリアライズするか識別します。この場合、メッセージはMTOMエンコーディングにシリアライズされます。次に、リモート・パーティに接続され、シリアライズされたリクエストでコールが行われます。
例2-28クライアント・コードのMessageImpl.PACKAGING_STYLEプロパティ
...
SOAPMessage request = MessageFactory.newInstance().createMessage();
...
// add some binary content
...
request.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MTOM);
SOAPConnection conn = SOAPConnectionFactory.newInstance().createConnection();
SOAPMessage response = sc.call(request, endpoint);
...
MessageImpl.PACKAGING_STYLE
プロパティは、関連するコンテンツが存在する場合のみ、指定するエンコードでメッセージを生成します。関連するコンテンツが提供されない場合、メッセージは予期しない書式になります。
たとえば、メッセージmsg
にバイナリ・コンテンツを指定し、MessageImpl.MTOM
値でMessageImpl.PACKAGING_STYLE
プロパティをコールするとします。
msg.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MTOM);
MTOMエンコーディングのメッセージを受信します。
バイナリではなく通常のMIME添付ファイルを指定すると、SWA MIMEメッセージを受信します。添付ファイルを指定しないと、SOAPのみのメッセージを受信します。
関連するコンテンツが存在しない場合にメッセージを特定のエンコーディングに強制する場合は、MessageImpl.PACKAGING_STYLE
プロパティとともにブール型プロパティMessageImpl.ATTACHMENT_STYLE_PACKAGING
を使用してください。たとえば、次のコード・サンプルでは、メッセージmsg
は強制的にMIME書式でエンコードされます。
... SOAPMessage msg = MessageFactory.newInstance().createMessage(); ... // add content to the message ... msg.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MIME); msg.setProperty(MessageImpl.ATTACHMENT_STYLE_PACKAGING, "true"); ...
関連資料:
|
OraSAAJ APIにより、WebサービスでSOAP 1.2メッセージを処理できます。ハンドラ、インターセプタ、プロバイダ・サービス、BPELなど、このAPIおよびSOAP 1.2を使用するアーティファクトでは、oracle.webservices.soap.OracleSOAPElement
インタフェースを使用してバイナリ・コンテンツの添付ファイルを処理できます。
OracleSOAPElement
インタフェースは、javax.xml.soap.SOAPElement
インタフェースを拡張します。
この項の内容は、次のとおりです。
関連資料:
|
xs:base64Binary
型データなどのバイナリ・コンテンツをメッセージに追加するには、OracleSOAPElement.setDataHandler
メソッドを使用します。メッセージをMTOM書式でエンコードするには、MessageImpl.PACKAGING_STYLE
プロパティを使用します。
例2-29に、バイナリ・コンテンツをメッセージに追加し、MTOM書式で添付ファイルをエンコーディングする方法を示します。SOAPElement
型のpicture
要素がSOAPメッセージ本体に追加されます。BufferedImage
画像オブジェクトは、高さおよび幅10、各ピクセルに1ビットの色モデル、1バイトに8ピクセルで定義されます(TYPE_BYTE_BINARY
)。picture
要素は、OracleSOAPElement
にキャストされるため、setDataHandler
メソッドを適用できます。このメソッドはファイル(image/jpeg
はjava.awt.Image
に対応するMIMEコンテンツ型)をロードします。MessageImpl.PACKAGING_STYLE
プロパティは、バイナリ添付ファイルをMTOM書式でエンコードすることを示します。結果のメッセージは、出力ストリームbaos
に書き込まれます。
例2-29 MTOMエンコード添付ファイルとしてのバイナリ・コンテンツのメッセージへの追加
... SOAPElement picture = msg.getSOAPBody().addChildElement("Picture"); BufferedImage image = new BufferedImage(10, 10, BufferedImage.TYPE_BYTE_BINARY); ((OracleSOAPElement)picture).setDataHandler(new DataHandler(image, "image/jpeg")); msg.setProperty(MessageImpl.PACKAGING_STYLE, MessageImpl.MTOM); msg.writeTo(baos); ...
OracleSOAPElement
からコンテンツにアクセスするには、OracleSOAPElement.getDataHandler
メソッドを使用します。メソッドで提供するのはメッセージ・データのハンドラのみで、データをエンコードする必要はありません。
例2-30に、メッセージ・コンテンツを取得するOracleSOAPElement.getDataHandler
メソッドの使用方法を示します。メソッドでは、メッセージmsg
にはxs:base64Binary
コンテンツを含む添付ファイル、ここではjava.awt.Image
、があるとします。コードでSOAPMessage
の子要素のコンテンツを取得し、OracleSOAPElement
picture
に保存します。次に、OracleSOAPElement.getDataHandler
メソッドでpicture
からコンテンツを取得し、Image
オブジェクトに保存します。
この項の内容は、次のとおりです。
Direct Internet Message Encapsulation(DIME)は、マルチパート・メッセージの添付ファイルを伝送中にストリーミングするための形式です。DIMEは、添付ファイル付きのSOAPメッセージにも適用できます。DIMEでは、ペイロードのサイズとタイプを示す単純なバイナリSOAPヘッダーを使用し、SOAPメッセージまたは添付ファイルのように各レコードを分割します。また、DIMEでは、指定されたペイロードを複数のレコードに分割することもできます。これにより、送信者は制限されたサイズのバッファでデータをストリーミングできます。
OracleAS Web Servicesがデフォルトで使用するマルチパートMIMEエンコーディング形式に比べ、DIMEではエンコードまたはデコードをかなり簡単に処理できます。
OracleAS Web Servicesでは、DIMEエンコードの相互運用可能なメッセージのサポートと、Oracle独自のDIMEエンコーディングのメッセージのサポートを選択できます。
添付ファイル付きメッセージの相互運用可能なDIMEエンコーディングは、WSDLに拡張を追加することで実装されます。
Oracle独自のDIMEエンコーディングは、添付ファイル付きのすべてのSOAPメッセージにDIMEエンコーディングを適用するコードの生成をWebServicesAssemblerに許可することで実装されます。
DIMEエンコード・メッセージのWSDL拡張は、Microsoft社のDIMEサポートの実装です。この方法により、WSDLにDIME拡張を実装している他ベンダー(特にMicrosoft)と相互運用可能な添付ファイル付きのメッセージが作成されます。この拡張により、エンベロープ内のバイナリ・データが抽出されて添付ファイルに配置されます。その後、これらのメッセージと添付ファイルは、DIMEでエンコードされます。
「WSDL Extension for SOAP in DIME」仕様では、DIME要素 <dime:message>
が定義されています。WSDLにこの要素が追加されていると、SOAPメッセージ内のすべてのバイナリ・データが自動的に削除され添付ファイルに配置されます。メッセージおよびその添付ファイルは、デフォルトのマルチパートのMIME形式ではなく、DIME形式で送信されます。
関連資料:
|
<dime:message>
要素は、Webサービス操作のバインディング定義の<wsdl:input>
または<wsdl:output>
要素(あるいはその両方)に挿入されます。表2-4に、<dime:message>
に含まれる必要のある属性を説明します。
表2-4 <dime:message>に必要な属性
属性 | 説明 |
---|---|
layout="uri" |
主なSOAPメッセージがどのようにしてDIMEメッセージの添付ファイルを参照するかを指定します。次に予想されるURIの値を示します。
|
wsdl:required="true" |
WSDLが必要なことを示します。この属性は |
例2-31に、DIMEエンコーディング用の拡張が太字で強調されたWSDLスケルトンを示します。
例2-31 DIMEエンコーディング用に拡張されているWSDLスケルトン
<wsdl:definitions ...> <wsdl:binding ...> <soap:binding .../> <wsdl:operation ...> <soap:operation .../> <wsdl:input> <dime:message layout="uri" wsdl:required="true"/>? <-- extensibility elements --> </wsdl:input> <wsdl:output> <dime:message layout="uri" wsdl:required="true"/>? <-- extensibility elements --> </dime:message> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions>
WebServicesAssemblerは、useDimeEncoding
引数を提供することでDIMEエンコード形式をサポートしています。この引数は、生成されたサービスまたはスタブ内の、添付ファイル付きのすべてのストリーミングSOAPメッセージにDIMEエンコーディングを適用します。
useDimeEncoding
引数を使用して生成されたメッセージには相互運用性がなく、Oracle以外のWebサービスや旧バージョンのOracle Application Serverとの互換性がありません。この引数を使用したWebサービスの生成は、パフォーマンスが重要視される社内プロジェクトに向いています。
関連資料: 『Oracle Application Server Web Services開発者ガイド』の「Webサービス・アセンブリ用の一般引数」の「useDimeEncoding」に関する項を参照してください。 |
WSIFクライアントを有効化してメッセージ添付ファイルを処理する方法の詳細は、「WSIFへのメッセージ添付ファイルの追加方法」で説明しています。この項の内容は、次のとおりです。
詳細は、次を参照してください。
WSIFクライアントを有効化して添付ファイルを処理する場合は、第9章「Webサービス起動フレームワークの使用方法」を参照してください。
Webサービスをトップダウン方式でアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「WSDLからのWebサービスのアセンブル」を参照してください。
Javaクラスを使用してWebサービスをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「Javaクラスを使用したWebサービスのアセンブル」を参照してください。
EJBを使用してWebサービスをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「EJBを使用したWebサービスのアセンブル」を参照してください。
JMSトピックおよび宛先を使用してWebサービスをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「JMS宛先を使用したWebサービスのアセンブル」を参照してください。
PL/SQLパッケージ、SQL問合せ、DML文、Oracle Streams AQまたはサーバー・サイドJavaクラスなどのデータベース・リソースを使用してWebサービスをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「データベースWebサービスのアセンブル」を参照してください。
J2EE Webサービス・クライアントをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「J2EE Webサービス・クライアントのアセンブル」を参照してください。
J2SE Webサービス・クライアントをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「J2SE Webサービス・クライアントのアセンブル」を参照してください。
WebServicesAssemblerコマンドを使用してWebサービス・アーティファクトをアセンブルする場合は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。