2013-08-02 25 views
9

Tôi đang tạo một dịch vụ web có trục cam. Tôi đang sử dụng SAAJ, JAXB và Servlet. Tôi có thể marshall và unmarshall một lớp học với JAXB một cách chính xác. Nhưng làm thế nào tôi có thể sử dụng cùng SAAJ và JAXB cho truyền thông SOAP. Tôi muốn đặt văn bản xml đã được chuyển đổi JAXB vào thẻ SOAP BODY với SAAJ. Tôi có thể làm cái này như thế nào? Tôi đọc các tài liệu SAAJ trên trang web của Oracle nhưng không dễ hiểu. Họ nói rất phức tạp.Tham gia SAAJ và JAXB

Trả lời

18

Bạn có thể làm như sau:

Demo

SOAPBody thực hiện org.w3c.dom.Node vì vậy bạn có thể có JAXB bạn thực hiện soái với nó:

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)

Bên dưới là một mô hình Java đơn giản chúng ta sẽ sử dụng ví dụ này:

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

} 

Output

Dưới đây là kết quả từ chạy code demo (Tôi đã định dạng nó trong câu trả lời của tôi để làm cho nó dễ dàng hơn để đọc) .

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

CẬP NHẬT

Dưới đây là một ví dụ sử dụng JAXB với các API JAX-WS (để biết chi tiết về dịch vụ see: 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

đó là câu trả lời rất hay. Vì vậy, tôi tìm thấy một api khác tên là jax-ws. cách nào tốt hơn? SAAJ & JAXP hoặc jax-ws? – kodmanyagha

+0

Bạn đang hỏi người tạo ra JAXB những gì anh ấy thích? Những gì bạn mong đợi anh ta nói ... –

+1

@StephenD - Tôi là một phần của nhóm đã tạo ra JAXB (JSR-222), và EclipseLink JAXB (MOXy) dẫn :). JAXB là lớp ràng buộc mặc định cho JAX-WS, vì vậy cả hai làm việc độc đáo với nhau. –