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 myBinary
和 myDataHandler
中,将处理为二进制附件,而整个 XOP 对象将作为 XML 发送。代替二进制文件,将仅生成其引用。javax.activation.DataHandler
是最常用的类型。如果需要 java.io.InputStream
或 javax.activation.DataSource
,您需要使用 DataHandler
。Java.awt.Image
和 javax.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
注释并返回适当的类型。