2.7.11.4. XML-二进制优化打包(XOP)


如果您的 JAXB 标注了 POJO,并且也包含一些二进制内容,您可以选择将其发送成不需要以任何方式(如 base64 或十六进制)来发送它。这可通过 XOP 实现,从而在仍然使用方便的 POJO 的同时加快传输速度。

RESTEasy 允许将 XOP 消息打包为 多部分/相关.

若要配置 XOP,您首先需要带注释的 JAXB 标注的 POJO。

示例:jakarta XML Binding POJO

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public static class Xop {

    private Customer bill;
    private Customer monica;

    @XmlMimeType(MediaType.APPLICATION_OCTET_STREAM)
    private byte[] myBinary;

    @XmlMimeType(MediaType.APPLICATION_OCTET_STREAM)
    private DataHandler myDataHandler;

    // methods, other fields ...
}

注意

@XmlMimeType 告知 JAXB 二进制内容的 mime 类型。这不需要执行 XOP 打包,但如果您知道确切的类型,则建议对其进行设置。

在上面的 POJO myBinarymyDataHandler 中,将处理为二进制附件,而整个 XOP 对象将作为 XML 发送。代替二进制文件,将仅生成其引用。javax.activation.DataHandler 是最常用的类型。如果需要 java.io.InputStreamjavax.activation.DataSource,您需要使用 DataHandlerJava.awt.Imagejavax.xml.transform.SourceSome 也可用。

示例:使用 XOP 的客户端发送二进制内容

// our client interface:
@Path("mime")
public static interface MultipartClient {
    @Path("xop")
    @PUT
    @Consumes(MultipartConstants.MULTIPART_RELATED)
    public void putXop(@XopWithMultipartRelated Xop bean);
}

// Somewhere using it:
{
    MultipartClient client = ProxyFactory.create(MultipartClient.class,
        "http://www.example.org");
    Xop xop = new Xop(new Customer("bill"), new Customer("monica"),
        "Hello Xop World!".getBytes("UTF-8"),
        new DataHandler(new ByteArrayDataSource("Hello Xop World!".getBytes("UTF-8"),
        MediaType.APPLICATION_OCTET_STREAM)));
    client.putXop(xop);
}

注意

上例假定 客户 类标注了 JAXB。

@Consumes(MultipartConstants.MULTIPART_RELATED) 用于告知 RESTEasy,您要发送 多部分/相关 软件包,这是保存 XOP 消息的容器格式。@XopWithMultipartRelated 用于告知 RESTEasy,您想要发出 XOP 消息。

示例:用于接收 XOP 的 RESTEasy Server

@Path("/mime")
public class XopService {
    @PUT
    @Path("xop")
    @Consumes(MultipartConstants.MULTIPART_RELATED)
    public void putXopWithMultipartRelated(@XopWithMultipartRelated Xop xop) {
        // do very important things here
    }
}

@consumes(MultipartConstants.MULTIPART_RELATED) 用于告知 RESTEasy,您希望读取 多部分/相关 包。@XopWithMultipartRelated 用于 告知 RESTEasy 想要读取 XOP 消息。您可以将 RESTEasy 服务器配置为以类似的方式生成 XOP 值,方法是添加 @Produces 注释并返回适当的类型。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.