2013-08-02 11 views
9

Ich erstelle einen Web-Service ohne Achse. Ich benutze SAAJ, JAXB und Servlet. Ich kann eine Klasse mit JAXB korrekt marshallen und abmarshallen. Aber wie kann ich zusammen SAAJ und JAXB für die SOAP-Kommunikation verwenden? Ich möchte den JAXB-konvertierten XML-Text in SOAP BODY-Tag mit SAAJ setzen. Wie kann ich das machen? Ich lese SAAJ-Dokumente, die auf der Oracle-Website sind, aber es ist nicht verständlich. Sie erzählen so komplex.Joining SAAJ und JAXB

Antwort

18

könnten Sie wie folgt vorgehen:

Demo

SOAPBody implementiert org.w3c.dom.Node so können Sie Ihre JAXB Umsetzung Marschall darauf haben:

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 Model (Foo)

Unten ein einfaches Java-Modell ist, dass wir für dieses Beispiel verwenden:

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; 
    } 

} 

Ausgabe

Im Folgenden wird die Ausgabe von Ausführen des Demo-Code (ich es in meiner Antwort formatiert habe es leichter lesbar zu machen) .

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

UPDATE

Unten ist ein Beispiel JAXB mit dem JAX-WS-APIs (genauere Informationen zu Service siehe: 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()); 
    } 

} 
+0

das ist eine sehr gute Antwort. Also habe ich eine andere API gefunden, der Name ist Jax-Ws. Welchen Weg besser? SAAJ & JAXP oder Jax-Ws? – kodmanyagha

+0

Sie fragen den Schöpfer von JAXB, was er bevorzugt? Was erwarten Sie von ihm zu sagen ... –

+1

@StephenD - Ich bin Teil der Gruppe, die JAXB (JSR-222) erstellt, und der EclipseLink JAXB (MOXy) führen :). JAXB ist der Standard-Binding-Layer für JAX-WS, sodass beide gut zusammenarbeiten. –