2011-10-04 27 views
1

我想使用JAXWS在java中構建soap客戶端。我在谷歌搜索,但沒有找到任何相關的信息。這是我曾嘗試:使用JAX連接到SOAP WS

 QName serviceName = new QName("urn:Site", "Site"); 
    QName portName = new QName("urn:Site", "Server_HandlerPort"); 
    String endpointAddress = "http://myhost/url/soap"; 
    Service service = Service.create(serviceName); 
    service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress); 
    Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); 
    BindingProvider bp = (BindingProvider) dispatch; 
    MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory(); 
    SOAPMessage request = factory.createMessage(); 
    SOAPHeader header = request.getSOAPHeader(); 
    SOAPBody body = request.getSOAPBody(); 
    QName payloadName = new QName("session"); 
    SOAPBodyElement payload = body.addBodyElement(payloadName); 
    SOAPMessage reply = null; 
    try { 
     reply = dispatch.invoke(request); 
    } catch (WebServiceException wse){ 
     wse.printStackTrace(); 
    } 

    body = reply.getSOAPBody(); 
    QName responseName = new QName("urn:site","sessionResponse"); 
    SOAPBodyElement bodyElement = (SOAPBodyElement) body.getChildElements(responseName).next(); 
    System.out.println(bodyElement.getValue()); 

這不起作用。這總是返回null我不知道爲什麼?誰可以幫我這個事?任何示例?做這樣的事情?

+0

任何錯誤/蹤跡? – Santosh

+0

@Santosh:沒有。沒有錯誤。 –

回答

4

JAX-WS允許您使用wsimport從Web服務的WSDL生成客戶端。 這將使客戶端代碼更加簡單。 下面是一個示例tutorial

0

從我注意到,發生在一個響應的dispatch.invoke不會SOAPMessage填充體,信封等解組,而是它創建了一個內部Document它鏈接到SOAPPart

如果調用reply.writeTo(System.out)的invoke被調用後,它會打印完整的響應消息到控制檯。

您可以瀏覽Document(本例中實際上是根Element)並獲取您的sessionResponse。這裏是一個代碼片段:

NodeList nodeList = reply.getSOAPPart().getDocumentElement().getElementsByTagNameNS("urn:site", "sessionResponse"); 
Node node = nodeList.item(0); 

現在取決於響應的結構,您可能需要在樹中進行一些導航。讓我們假設你的回答是這樣的:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
    <ns2:sessionResponse xmlns:ns2="urn:site"> 
     <return>Hello World!</return> 
    </ns2:sessionResponse > 
    </S:Body> 
</S:Envelope> 

爲了獲取返回的值,就會撥打:

System.out.println(node.getFirstChild().getFirstChild().getNodeValue()); 
  • 1 getFirstChild返回return節點
  • 第二getFirstChild返回text節點

如果需要Document對象,而不是從你需要轉換SOAPPartSOAPPartImplSOAPPartElement對象:

Document document = ((SOAPPartImpl) response.getSOAPPart()).getDocument();