この章の内容は、次のとおりです。
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属性をassembleAntタスクに追加する点のみが異なります。
|
関連資料:
|
この項の例では、次の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;
}
}
assembleAntタスクを使用して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属性をtopDownAssembleAntタスクに追加する点のみが異なります。
|
関連資料:
|
たとえば、バイナリ・データを処理するWSDLが、genInterfaceAntタスクへの入力としてすでに指定されていると仮定します。また、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属性をgenProxyAntタスクに追加する点のみが異なります。
|
関連資料:
|
次の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);
|
注意: バイナリ・コンテンツに直接アクセスしない場合、OracleSOAPElementAPIを使用する必要はありません。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の使用方法」を参照してください。