【问题标题】:Joining SAAJ and JAXB加入 SAAJ 和 JAXB
【发布时间】:2013-08-02 11:23:54
【问题描述】:

我正在创建一个没有轴的 Web 服务。我正在使用 SAAJ、JAXB 和 Servlet。我可以正确地用 JAXB 编组和解组一个类。但是如何将 SAAJ 和 JAXB 一起用于 SOAP 通信。我想用 SAAJ 将 JAXB 转换的 xml 文本放入 SOAP BODY 标记。我怎样才能做到这一点?我阅读了 Oracle 网站上的 SAAJ 文档,但无法理解。他们讲的很复杂。

【问题讨论】:

    标签: java soap jaxb saaj


    【解决方案1】:

    您可以执行以下操作:

    演示

    SOAPBody 实现 org.w3c.dom.Node,因此您可以让您的 JAXB 实现编组:

    import javax.xml.bind.*;
    import javax.xml.soap.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            MessageFactory mf = MessageFactory.newInstance();
            SOAPMessage message = mf.createMessage();
            SOAPBody body = message.getSOAPBody();
    
            Foo foo = new Foo();
            foo.setBar("Hello World");
    
            JAXBContext jc = JAXBContext.newInstance(Foo.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.marshal(foo, body);
    
            message.saveChanges();
            message.writeTo(System.out);
        }
    
    }
    

    Java 模型(Foo)

    下面是我们将用于此示例的简单 Java 模型:

    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Foo {
    
        private String bar;
    
        public String getBar() {
            return bar;
        }
    
        public void setBar(String bar) {
            this.bar = bar;
        }
    
    }
    

    输出

    以下是运行演示代码的输出(我已在答案中对其进行了格式化以使其更易于阅读)。

    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
        <SOAP-ENV:Header />
        <SOAP-ENV:Body>
            <foo>
                <bar>Hello World</bar>
            </foo>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    

    更新

    以下是使用 JAXB 和 JAX-WS API 的示例(有关服务的详细信息,请参阅:http://blog.bdoughan.com/2013/02/leveraging-moxy-in-your-web-service-via.html)。

    import javax.xml.bind.JAXBContext;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Dispatch;
    import javax.xml.ws.Service;
    import javax.xml.ws.soap.SOAPBinding;
    import blog.jaxws.provider.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            QName serviceName = new QName("http://service.jaxws.blog/", "FindCustomerService");
            Service service = Service.create(serviceName);
            QName portQName = new QName("http://example.org", "SimplePort");
            service.addPort(portQName, SOAPBinding.SOAP11HTTP_BINDING, "http://localhost:8080/Provider/FindCustomerService?wsdl");
    
            JAXBContext jc = JAXBContext.newInstance(FindCustomerRequest.class, FindCustomerResponse.class);
            Dispatch<Object> sourceDispatch = service.createDispatch(portQName, jc, Service.Mode.PAYLOAD);
            FindCustomerRequest request = new FindCustomerRequest();
            FindCustomerResponse response = (FindCustomerResponse) sourceDispatch.invoke(request);
            System.out.println(response.getValue().getFirstName());
        }
    
    }
    

    【讨论】:

    • 这是非常好的答案。所以我找到了另一个名为 jax-ws 的 api。哪种方式更好? SAAJ 和 JAXP 还是 jax-ws?
    • 您是在问 JAXB 的创建者他更喜欢什么?你希望他说什么……
    • @StephenD - 我是创建 JAXB (JSR-222) 和 EclipseLink JAXB (MOXy) 领导的小组的一员 :)。 JAXB 是 JAX-WS 的默认绑定层,因此两者可以很好地协同工作。
    • 我在 10 分钟前刚刚问了一个关于 JAXB 的问题,但我找到了您发布的答案,其中显示了一个易于理解的示例。谢谢!
    • @kodmanyagha - 我已经用一个使用 JAX-WS API 的示例更新了我的答案,因此您可以比较您的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多