9.2. MTOM を使用するためのデータ型へのアノテーション
概要
WSDL では、イメージファイルやサウンドファイルなど、バイナリーデータのブロックに渡すデータ型を定義する場合、xsd:base64Binary
型のデータの要素を定義します。デフォルトでは、xsd:base64Binary
型のすべての要素によって、MTOM を使用してシリアライズ可能な byte[]
が生成されます。ただし、コードジェネレーターのデフォルトの動作では、シリアル化を十分に活用していません。
MTOM を十分に活用するには、サービスの WSDL ドキュメントまたはバイナリーデータ構造を実装する JAXB クラスのいずれかにアノテーションを追加する必要があります。WSDL ドキュメントにアノテーションを追加すると、コードジェネレーターはバイナリーデータのストリーミングデータハンドラーを生成します。JAXB クラスにアノテーションを付けるには、適切なコンテンツタイプを指定する必要があり、バイナリーデータを含むフィールドのタイプ指定を変更することが必要になる場合もあります。
最初に WSDL
例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 名前空間で定義され、要素に含まれると予想される MIME タイプを指定します。MIME タイプのコンマ区切りリストを指定できます。この属性の設定により、コードジェネレーターがデータの JAXB クラスを作成する方法が変更されます。ほとんどの MIME タイプでは、コードジェネレーターが DataHandler を作成します。イメージ用などの一部の MIME タイプには、マッピングが定義されています。
MIME タイプは、Internet Assigned Numbers Authority (IANA) によって維持され、Multipurpose Internet Mail Extensions (MIME) パート 1: インターネットメッセージ本文 と Multipurpose Internet Mail Extensions (MIME) パート 2: メディアタイプ で詳細に説明されています。
ほとんどの場合、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
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;
...
}