9.2. 使用 MTOM 注解数据类型
概述
在 WSDL 中,当定义用于传输二进制数据的数据类型时,如镜像文件或声音文件,您可以定义类型为 xsd:base64Binary
数据的元素。默认情况下,任何类型为 xsd:base64Binary
的元素都会生成使用 MTOM 进行序列化的 byte[]
。但是,代码生成器的默认行为不会充分利用序列化。
要充分利用 MTOM,您必须添加注解到服务的 WSDL 文档或用于实施二进制数据结构的 JAXB 类。将注解添加到 WSDL 文档中会强制代码生成器为二进制数据生成流传输数据处理程序。标注 JAXB 类涉及指定正确内容类型,并可能涉及更改包含二进制数据的字段的类型规格。
先 WSDL
例 9.1 “MTOM 信息” 显示 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 类型由互联网编号分配机构(IANA)维护,在 多用途 Internet 邮件扩展(MIME)中详细介绍:互联网消息正文和 多用途 Internet 邮件扩展(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 类不再包含 字节[]
。相反,代码生成器会看到 xmime:expectedContentTypes
属性,并为 imageData 字段生成 DataHandler。
您不需要更改 绑定
元素以使用 MTOM。当发送数据时,运行时会进行适当的更改。
Java 第一
如果您正在进行 Java 首个开发,您可以通过执行以下操作使 JAXB 类 MTOM 准备好:
- 确保包含二进制数据的字段是 DataHandler。
-
将
@XmlMimeType()
注解添加到包含您要作为 MTOM 附加数据的字段。
例 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;
...
}