9.2. 注解数据类型以使用 MTOM


概述

在 WSDL 中,定义用于传递二进制数据(如镜像文件或声音文件)的数据类型时,您可以将数据的元素定义为 xsd:base64Binary。默认情况下,类型为 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 类型,代码生成器会创建一个 DataHandler。有些 MIME 类型(如镜像)定义了映射。

注意

对于大多数使用,您可以指定 application/octet-stream

例 9.2 “MTOM 的二进制数据” 演示了如何从 例 9.1 “MTOM 信息” 修改 xRayType 以使用 MTOM。

例 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。

注意

您不需要将 binding 元素更改为使用 MTOM。运行时在发送数据时进行适当的更改。

Java 首先

如果您正在进行 Java 首次开发,您可以通过执行以下操作使 JAXB 类 MTOM 就绪:

  1. 确保包含二进制数据的字段是 DataHandler。
  2. @XmlMimeType () 注释添加到包含您要作为 MTOM 附加的数据的字段。

例 9.3 “JAXB Class for MTOM” 显示使用 MTOM 标注的 JAXB 类。

例 9.3. JAXB Class for MTOM

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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.