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 を準備できます。
- バイナリーデータを保持するフィールドが DataHandler であることを確認します。
-
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;
...
}