サービスインタフェースにおけるアタッチメントによる XML ドキュメントの記述

Sean BrydonSmitha KangathSameer Tyagi

課題

クライアントとサービスが XML ドキュメントを交換する Web サービスとの対話のデザインでは、サービスインタフェース内の XML ドキュメントを記述する型を選択する必要があります。この決定は、多くの影響があります。選択された型は、サービスを記述した WSDL ファイルばかりでなく、サービス実装のコードにも反映されます。J2EE[tm] プラットフォーム (Java[tm] 2 Platform, Enterprise Edition) 1.4 アプリケーションでは、注文書や請求書などの XML ドキュメントの交換に、JAX-RPC (Java API for XML-based RPC) を使用します。 サービスインタフェースをデザインするときの XML ドキュメントを記述する型の選択肢は数多くあります。 この課題の対処法では、ドキュメント指向のサービスでアタッチメントを用いて XML ドキュメントを記述する際のデザイン時の考慮事項に焦点を当てています。これらの対処法については、ドキュメント指向のサービスエントリを参照してください。

対処法

クライアントとサービス間で交換する XML ドキュメントにアタッチメントを使用する場合の課題についていくつか考えてみましょう。アタッチメントを使用してドキュメントが交換されるようにする方法はいくつかあります。これらの方法は、アタッチメントの指定に使用する型で決まります。

対処法: アタッチメントによる XML ドキュメントのパッケージング

この方法では、SOAP メッセージに対するアタッチメントとして XML ビジネスドキュメントを記述します。SOAP の SwA (Messages with Attachments) では、MIME Multipart/Related パッケージを使用し、XML メッセージとともにバイナリデータやその他アタッチメントを送信する方法を定義しています。実際には、1 つの SOAP メッセージには、 MIME エンコーディングを使用して 1 つ以上のアタッチメントを含むことができ、このため、しばしば複合メッセージと呼ばれます。SOAP メッセージ本体ではなく、アタッチメントで情報を送信するのは、かなり効率的です。SOAP メッセージの本体が小さいほどその処理に要する時間が短くなり、メッセージにデータそのものが含まれるのではなく、データに対する参照が含まれるだけであるため、データを Java オブジェクトにマッピングする際の変換時間が短縮されます。

JAX-RPC は、SOAP アタッチメントの処理に JavaBeans[tm] アクティべーションフレームワークを使用します。このメッセージを Java にアンマーシャリングする際、JAX-RPC 実行時環境では、2 つのマッピング手法を利用できます。

  1. 実行時環境で内蔵の DataHandlers および DataContentHandlers を使用して、表 1 に示すように、既知の種類の MIME を Java オブジェクトに、その逆に Java オブジェクトを既知の種類の MIME にマッピングする。
  2. また、JavaBeans アクティべーションフレームワークを使用して、アタッチメントを javax.activation.DataHandler に、その逆に javax.activation.DataHandler をアタッチメントにマッピングする。

単純な意味では、このことはサービスエンドポイント内のメソッドが表 1 に示すような標準のデータ型を使用している場合、実行時環境は、SOAP メッセージ内の 1 つの MIME アタッチメントとしてその型をマッピングします。javax.activation.DataHandler を使用している場合は、DataHandlergetContent() を使用することによって、そのアタッチメントの内容を抽出することができます。インストールされている DataContentHandler が内容の種類を理解しない場合は、raw バイトを付きで java.io.InputStream オブジェクトが返されます。

MIME

image/gif

java.awt.Image

image/jpeg

java.awt.Image

text/plain

java.lang.String

multipart/*

javax.mail.internet.MimeMultipart

text/xml or application/xml

javax.xml.transform.Source

表 1: MIME の種類と Java データ型のマッピング

アタッチメントでの問題点の 1 つは、WSDL でアタッチメントを指定する標準の方法がないことです。かっては、SOAP Envelope の外部にある MIME パッケージの使用についても、ベンダー間の合意がありませんでした。これは、WS-I Attachment Profile 1.0 である程度解消されていて、現在は、アタッチメント処理に関する相互運用要件が定義され、J2EE 1.4 SDK (および JWSDP 1.4) で完全にサポートされています。MIME バインドを使用し WSDL から始めると、相互運用可能で WS-I に準拠したアタッチメントベースのサービスを構築することができます。WS-I Attachment Profile 1.0 にはまた、WSDL に定義されていないアタッチメントの処理に使用できるアタッチメントの種類を参照する新しい型、"swaRef" も定義されています。

ここでの例では、自身にアタッチメントとして送られてきた XML ドキュメントを受信できるサービスを説明します。コード例 1 の WSDL 抜粋は、MIME バインドの内容を示しています。

<types>
   <schema xmlns="http://www.w3.org/2001/XMLSchema"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    targetNamespace="urn:AttachmentPurchaseOrderService">
    <import namespace="http://ws-i.org/profiles/basic/1.1/xsd" schemaLocation="WS-ISwA.xsd"/>
    <element name="statusmessage" type="wsi:swaRef"/>
    <element name="InvalidPOException" type="string"/>
   </schema>
   </types>

    ...
   
    <message name="AttachmentPurchaseOrderServiceSEI_submitPO">
          <part name="attachment_1" type="xsd:hexBinary"/>
    </message>

    <message name="AttachmentPurchaseOrderServiceSEI_submitPOResponse">
        <part name="response" element="ns1:statusmessage"/>
    </message>
       
    <message name="InvalidPOException">
        <part name="InvalidPOException" element="ns1:InvalidPOException"/>
    </message>
    ...
    <portType name="AttachmentPurchaseOrderServiceSEI">
        <operation name="submitPO">
            <input message="tns:AttachmentPurchaseOrderServiceSEI_submitPO"/>
            <output message="tns:AttachmentPurchaseOrderServiceSEI_submitPOResponse"/>
                        <fault name="InvalidPOException" message="tns:InvalidPOException"/>
        </operation>
    </portType>
   
    <binding name="AttachmentPurchaseOrderServiceSEIBinding" type="tns:AttachmentPurchaseOrderServiceSEI">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="submitPO">
            <input>
                <mime:multipartRelated>       
                                        <mime:part>
                        <soap:body use="literal"/>
                    </mime:part>
                    <mime:part>
                        <mime:content part="attachment_1" type="text/xml"/>
                    </mime:part>
                </mime:multipartRelated>
            </input>
            <output>
                <mime:multipartRelated>
                    <mime:part>
                        <soap:body parts="response"  use="literal"/>
                    </mime:part>
                </mime:multipartRelated>
            </output>
                        <fault name="InvalidPOException">
                <soap:fault name="InvalidPOException" use="literal"/>
            </fault>
        </operation>
    </binding>

コード例 1: アタッチメントを使用して XML ドキュメントを交換するサービスの WSDL からの抜粋

コード例 2 のサービスエンドポイントインタフェースに生成された submitPO メソッドは、入力パラメータに対する標準のマッピングの使用法ばかりでなく、戻り値として swaRef データ型を持つ WS-I Attachment Profile 1.0 implementation の使用法を表しています。アタッチメントプロファイルを使用するには、この Java サービスインタフェースの Java 実装クラスにアプリケーションサーバーに固有のプロパティーセットが必要であり、J2EE 1.4 SDK の場合、それらプロパティーはそれぞれ、com.sun.xml.rpc.attachment.SetAttachmentContext と com.sun.xml.rpc.attachment.GetAttachmentContext である必要があることに注意してください。アタッチメントの使用法に関するサンプルアプリケーションのデザインドキュメントに、より詳細な例があります。

public interface AttachmentPurchaseOrderServiceSEI extends Remote {
    public URI submitPO(Source attachment_1) throws
        InvalidPOException, RemoteException;
}
コード例 2: サービスエンドポイントインタフェース

アタッチメントを使用するこの方法の欠点のいくつかは、相互運用性が犠牲になる可能性があることです。すべてのツールキットは、Attachment Profile 1.0 をサポートしているわけではありません。Attachment Profile 1.0 は WS-I Basic Profile 1.0 には含まれていませんが、将来、Basic Profile に含まれる予定です。実際問題として、現状、.NET プラットフォームでは、MIME アタッチメントのサポートはありません。このため、C# クライアントが消費する必要がある Web サービスをデザインする場合、今のところ、アタッチメントを使用することは、XML ドキュメントをやりとりする優れた選択肢ではありません。

参考資料

この項目に関する詳細は、次の資料を参照してください。

© Sun Microsystems 2005. All of the material in The Java BluePrints Solutions Catalog is copyright-protected and may not be published in other works without express written permission from Sun Microsystems.