2011-10-04 59 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();