9.2. 将数据类型注解为使用 MTOM
概述
在 WSDL 中,在定义传入二进制数据的数据类型时,如镜像文件或声文件,您可以定义要类型为 xsd:base64 inary 数据的元素。默认情况下,类型为 xsd:base64Binary 的任何元素都会生成 byte[],这些元素可以使用 MTOM 进行序列化。但是,代码生成器的默认行为不会充分利用序列化。
要充分利用 MTOM,您必须在服务的 WSDL 文档或实施二进制数据结构的 JAXB 类中添加注解。在 WSDL 文档中添加注解会强制代码生成器为二进制数据生成流数据处理程序。注解 JAXB 类涉及指定正确的内容类型,并可能涉及更改包含二进制数据的字段类型规格。
WSDL 首先
例 9.1 “MTOM 的消息” 显示 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 类型,代码生成器会创建一个数据处理程序。某些 MIME 类型(如镜像的那些类型)定义了映射。
MIME 类型由互联网编号授权机构(IANA)维护,并在 多用途互联网邮件扩展(MIME)中详细介绍:Internet Message Bo dies 和 多用途 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 就绪:
- 确保包含二进制数据的字段为数据处理程序。
-
将
@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;
...
}