java - SAAJ 与 JAXB 的兼容性

标签 java web-services jaxb jax-ws

我一直致力于创建一个基于 SAAJ 的客户端。一切似乎都工作正常,直到我实现了将附件作为 Web 服务请求的一部分发送的逻辑。

Web 服务操作很简单 - 它需要一个用于文件位置的字符串元素和一个用于文件内容的 base64binary 元素。

我已经使用 SoapUI 测试了 ws 操作,一切似乎都正常。但是,当我从基于 SAAJ 的客户端发送文件附件时,Web 服务操作将仅接收文件位置元素的值。我在ws-server上编写了一个处理程序来拦截WS操作请求,以查看附件是否到达了web-service。正如预期的那样,附件运行良好,我可以使用处理程序中的 SAAJ api 访问其内容。

这让我想知道 - 使用 SAAJ 发送附件并通过 JAXB 绑定(bind)接收附件时是否存在兼容性问题?我错过了什么吗?

感谢您的帮助!

最佳答案

您需要确保在 Unmarshaller 上注册 AttachmentUnmarshaller 才能接收 JAXB 中的附件。

import javax.activation.DataHandler;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.attachment.AttachmentUnmarshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(Demo.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setAttachmentUnmarshaller(new MyAttachmentUnmarshaller());
    }

    private static class MyAttachmentUnmarshaller extends AttachmentUnmarshaller {

        @Override
        public DataHandler getAttachmentAsDataHandler(String cid) {
            // TODO - Lookup MIME content by content-id, cid, and return as a DataHandler.
            ...
        }

        @Override
        public byte[] getAttachmentAsByteArray(String cid) {
            // TODO - Retrieve the attachment identified by content-id, cid, as a byte[]
            ...
        }

    }

}

关于java - SAAJ 与 JAXB 的兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3839089/

相关文章:

java - 如何从 Jersey 客户端程序提交多个实体到post方法?

java - 从 xsd 到数据库。如何?

java - jackson 对象数组

java - 如何在 jung 库中使用 DirectedSparseVertex() ?

iPhone 服务器客户端应用程序

java - JDK8 不适用于 JDK8(WS 客户端)

java - 在 JAXB 2.0 中扩展 JAXB 生成的对象

java - 将 xjc 的 -enableIntrospection 与 jaxws-maven-plugin 一起使用

java - Jersey 2.x 安全上下文不起作用?

java - 安全随机哈希