例: WSIF を使用した添付ファイル付き SOAP メッセージの引き渡し
Web Services Invocation Framework (WSIF) SOAP プロバイダーを使用して、標準 SOAP メッセージ用の SOAP 処理規則を変更せずに MIME multipart/related メッセージ内の添付ファイルを渡すための情報およびサンプル・コードです。 これには、SOAP 添付ファイル用の Web サービス記述言語 (WSDL) 拡張の書き込み方法、および型と型マッピングの処理方法が含まれます。
「W3C SOAP Messages with Attachments」の資料には、トランスポート用の multipart MIME 構造を使用して、SOAP メッセージとネイティブ・フォーマット (GIF または JPEG など) の 1 つ以上の添付ファイルを関連付けるための標準的な方法が記載されています。 具体的な使用法を定義するマルチパート/関連
MIME メディア タイプ、および MIME パッケージ内にバンドルされているエンティティへの URI 参照の使用規則。 この中では、標準 SOAP メッセージ用の SOAP 処理
規則を変更せずに、SOAP 1.1 メッセージを MIME multipart/related メッセージに
含めて送信するための技法を概説しています。
WSIF では、SOAP over HTTP サービスに WSIF サービスをリンクするための、SOAP プロバイダーを使用した MIME メッセージ内の添付ファイルの引き渡しがサポートされます。 添付ファイルは、 javax.activation.DataHandler オブジェクトです。 WSDL の添付ファイルの記述 には、mime:multipartRelated、mime:part および mime:content の各タグが使用されます。
例: SOAP 添付ファイルの WSDL 拡張を作成する
以下の WSDL 例で、attch という 1 つの添付ファイルを使用した簡単な操作を示します。
<binding name="MyBinding" type="tns:abc" >
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="MyOperation">
<soap:operation soapAction=""/>
<input>
<mime:multipartRelated>
<mime:part>
<soap:body use="encoded" namespace="http://mynamespace"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding"/>
</mime:part>
<mime:part>
<mime:content part="attch" type="text/html"/>
</mime:part>
</mime:multipartRelated>
</input>
</operation>
</binding>
- 操作 (この例では
MyOperation) の入力メッセージには、part属性 (この例ではattch) が必要です。MyOperationには、 添付ファイル以外の入力部分を含めることもできます。 - バインディング入力には、
<soap:body>タグまたは<mime:multipartRelated>タグのいずれかがなくてはなりません (両方は必要ありません)。 - MIME メッセージの場合、
<soap:body>タグは<mime:part>タグ内にあります。 バインディング入力には、<soap:body>タグを含む<mime:part>タグが 1 つだけ必要で、このタグには<mime:content>タグが含まれていてはなりません。 これは、<soap:body>タグではコンテンツ・タイプtext/xmlが前提となっているためです。 - MIME メッセージには複数の添付ファイルを含めることができ、
各添付ファイルは
<mime:part>タグで記述されます。 <soap:body>タグを含まない<mime:part>タグは、 それぞれ、添付ファイル自体を記述する<mime:content>タグを 含みます。<mime:content>タグ内のtype属性は、 Web Services Invocation Framework (WSIF) によって検査または使用されることはありません。 この属性は、WSIF を使用するアプリケーションに対し添付ファイルの内容 を示すために提供されています。 単一の<mime:part>タグ内に 複数の<mime:content>タグがある場合、バックエンド・サービスは、 その<mime:part>タグ内の<mime:content>タグのいずれかで指定された型の 単一添付ファイルがあると予想します。<soap:body>タグ内のparts="..."属性 (オプション) には、 メッセージ内のすべての SOAP パートと すべての MIME パートの名前が含まれていることが想定されます。
例: WSIF を使用した SOAP 添付ファイルの受け渡し
次のコードフラグメントは、サンプルWSDLで記述されたサービスを呼び出すことができます。例: SOAP 添付ファイルの WSDL 拡張の記述:
import javax.activation.DataHandler;
. . .
DataHandler dh = new DataHandler(new FileDataSource(myimage.jpg
));
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
WSIFService service = factory.getService(my.wsdl
,null,null,http://mynamespace
,abc
);
WSIFOperation op = service.getPort().createOperation(MyOperation
);
WSIFMessage in = op.createInputMessage();
in.setObjectPart(attch
,dh);
op.executeInputOnlyOperation(in);
DeploymentDescriptor.xml ファイル内で関連付けられる型マッピングは、
ご使用の SOAP サーバーによって異なります。 例えば、SOAP 2.3 で Tomcat を使用している場合、DeploymentDescriptor.xml ファイルには、
以下のような型マッピングが含まれます。
<isd:mappings>
<isd:map encodingStyle=http://schemas.xmlsoap.org/soap/encoding/
xmlns:x=http://mynamespace
qname=x:datahandler
javaType=javax.activation.DataHandler
java2XMLClassName=org.apache.soap.encoding.soapenc.MimePartSerializer
xml2JavaClassName=org.apache.soap.encoding.soapenc.MimePartSerializer
/>
</isd:mappings>
この場合、バックエンド・サービスは、以下のシグニチャーに よって呼び出されます。
public void MyOperation(DataHandler dh);スタブを使用して、添付ファイルを Web Services Invocation Framework (WSIF) に渡すこともできます。
DataHandler dh = new DataHandler(new FileDataSource(myimage.jpg
));
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
WSIFService service = factory.getService(my.wsdl
,null,null,http://mynamespace
,abc
);
MyInterface stub = (MyInterface)service.getStub(MyInterface.class);
stub.MyOperation(dh);
オペレーションから添付ファイルを戻すこともできますが、戻りパラメーターとして戻すことができるのは 1 つの添付ファイルのみです。
SOAP 添付ファイル - 型および型マッピングの使用
デフォルトでは、添付ファイルは WSIF に DataHandler オブジェクトとして渡されます。 メッセージの
一部である DataHandler オブジェクトを WSDL の <mime:part> タグにマップする場合、WSIF は自動的に WSDL 型の完全修飾名を DataHandler クラスにマップして、
その型マッピングを SOAP プロバイダーにセットアップします。
ユーザーによっては、WSDL で既に添付ファイル用のスキーマを定義済み (binary[] 型など) である場合があります。 明示的に mapType() メソッドを
実行する場合を除き、WSIF はこのマッピングを暗黙的に無視し、添付ファイルを DataHandler オブジェクトとして処理します。 WSIF により、SOAP プロバイダーは、
WSDL の <mime:content> タグに指定された type 属性ではなく、
DataHandler オブジェクトの型に基づいて MIME コンテンツ・タイプを設定することができます。
SOAP 添付ファイル - サポートされていないシナリオ
- DIME の使用。
javax.xml.transform.Sourceおよびjavax.mail.internet.MimeMultipartへの引き渡し。- mime:mimeXml WSDL タグの使用。
- mime:multipartRelated タグの mime:part タグへのネスティング。
DataHandler、Imageなどを拡張する型の使用。DataHandler、Imageなどを含む型の使用。DataHandlers、Imagesなどの配列またはベクトルの使用。- 複数の入出力または出力の添付ファイル。