使用JAX WS连接到SOAP

时间:2011-10-04 10:37:43

标签: java soap jax-ws

我想使用JAXWS在java中构建一个soap客户端。我在谷歌搜索但没有找到任何相关信息。这是我尝试过的:

     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我不知道为什么?谁可以帮我这个事?任何例子?做这样的事情?

2 个答案:

答案 0 :(得分:5)

JAX-WS允许您使用wsimport从Web服务的WSDL生成客户端。 这将使客户端代码更加简单。 这是一个示例tutorial

答案 1 :(得分:0)

根据我的注意,响应的dispatch.invoke中发生的解组不会填充来自SOAPMessage的正文,信封等,而是会创建一个内部Document已链接到SOAPPart

如果在调用调用后调用reply.writeTo(System.out),它会将完整的响应消息打印到控制台中。

您可以浏览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());
  • 第一个getFirstChild返回return节点
  • 第二个getFirstChild返回text节点

如果您需要来自Document的{​​{1}}对象而不是Element对象,则需要将SOAPPart转换为SOAPPart

SOAPPartImpl