Menu Close

9.2. MTOM を使用するためのデータ型へのアノテーション付け

概要

WSDL では、イメージファイルやサウンドファイルなど、バイナリーデータのブロックに渡すデータ型を定義する場合、xsd:base64Binary 型のデータの要素を定義します。デフォルトでは、xsd:base64Binary 型のすべての要素によって、MTOM を使用してシリアライズ可能な byte[] が生成されます。ただし、コードジェネレーターのデフォルト動作は、シリアル化を完全に活用しません。

MTOM を活用するには、アノテーションをサービスの WSDL ドキュメントまたはバイナリーデータ構造を実装する JAXB クラスに追加する必要があります。アノテーションを WSDL ドキュメントに追加すると、コードジェネレーターがバイナリーデータのストリーミングデータハンドラーを生成するように強制されます。JAXB クラスのアノテーションを付けるには、適切なコンテンツ型を指定し、バイナリーデータが含まれるフィールドの型指定を変更が必要になることもあります。

WSDL first

例9.1「MTOM のメッセージ」 は、1 つの文字列フィールド、1 つの整数フィールド、およびバイナリーフィールドが含まれるメッセージを使用する Web サービスの WSDL ドキュメントを示しています。バイナリーフィールドは、大きなイメージファイルを格納することを目的としているため、通常の SOAP メッセージのパートとして送信することは適切ではありません。

例9.1 MTOM のメッセージ

<?xml version="1.0" encoding="UTF-8"?>
<definitions name="XrayStorage"
    targetNamespace="http://mediStor.org/x-rays"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://mediStor.org/x-rays"
    xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
    xmlns:xsd1="http://mediStor.org/types/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <types>
    <schema targetNamespace="http://mediStor.org/types/"
            xmlns="http://www.w3.org/2001/XMLSchema">
      <complexType name="xRayType">
        <sequence>
          <element name="patientName" type="xsd:string" />
          <element name="patientNumber" type="xsd:int" />
          <element name="imageData" type="xsd:base64Binary" />
        </sequence>
      </complexType>
      <element name="xRay" type="xsd1:xRayType" />
    </schema>
  </types>

  <message name="storRequest">
    <part name="record" element="xsd1:xRay"/>
  </message>
  <message name="storResponse">
    <part name="success" type="xsd:boolean"/>
  </message>

  <portType name="xRayStorage">
    <operation name="store">
      <input message="tns:storRequest" name="storRequest"/>
      <output message="tns:storResponse" name="storResponse"/>
    </operation>
  </portType>

  <binding name="xRayStorageSOAPBinding" type="tns:xRayStorage">
    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="store">
      <soap12:operation soapAction="" style="document"/>
      <input name="storRequest">
        <soap12:body use="literal"/>
      </input>
      <output name="storResponse">
        <soap12:body use="literal"/>
      </output>
    </operation>
  </binding>
  ...
</definitions>

MTOM を使用してメッセージのバイナリー部分を最適化された添付ファイルとして送信する場合は、xmime:expectedContentTypes 属性をバイナリデータが含まれる要素に属性を追加する必要があります。この属性は http://www.w3.org/2005/05/xmlmime namespace に定義され、要素に含まれることが予想される MIME タイプを指定します。MIME タイプのカンマ区切りの一覧を指定できます。この属性の設定により、コードジェネレーターによるデータの JAXB クラスの作成方法が変更されます。ほとんどの MIME タイプでは、コードジェネレーターは DataHandler を作成します。イメージ用のものなど、一部の MIME タイプには、マッピングが定義されています。

注記

MIME タイプは、Internet Assigned Numbers Authority (IANA) で維持され、『Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies』および『Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types』に詳しく説明されています。

ほとんどの場合は application/octet-stream を指定します。

例9.2「MTOM のバイナリーデータ」 は、MTOM の使用のするために 例9.1「MTOM のメッセージ」 から xRayType を変更する方法を表しています。

例9.2 MTOM のバイナリーデータ

...
  <types>
    <schema targetNamespace="http://mediStor.org/types/"
            xmlns="http://www.w3.org/2001/XMLSchema"
            xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
      <complexType name="xRayType">
        <sequence>
          <element name="patientName" type="xsd:string" />
          <element name="patientNumber" type="xsd:int" />
          <element name="imageData" type="xsd:base64Binary"
                   xmime:expectedContentTypes="application/octet-stream"/>
        </sequence>
      </complexType>
      <element name="xRay" type="xsd1:xRayType" />
    </schema>
  </types>
...

xRayType 用に生成された JAXB クラスには byte[] が含まれなくなりました。代わりに、コードジェネレーターは xmime:expectedContentTypes 属性を認識し、imageData フィールドの DataHandler を生成します。

注記

MTOM を使用するには binding 要素を変更する必要はありません。ランタイムは、データ送信時に適切な変更を加えます。

Java first

Java を初めて開発する場合は、以下を行うことで JAXB クラス MTOM を準備できます。

  1. バイナリーデータを保持するフィールドが DataHandler であることを確認します。
  2. MTOM 添付ファイルとしてストリーミングするデータを含むフィールドに @XmlMimeType() アノテーションを追加します。

例9.3「MTOM の JAXB クラス」 は、MTOM を使用するためにアノテーション付けされた JAXB クラスを表しています。

例9.3 MTOM の JAXB クラス

@XmlType
public class XRayType {
    protected String patientName;
    protected int patientNumber;
    @XmlMimeType("application/octet-stream")
    protected DataHandler imageData;
  ...
}