Подключитесь к SOAP с помощью JAX WS - PullRequest
1 голос
/ 04 октября 2011

Я хочу собрать мыльный клиент в Java, используя JAXWS.Я искал в Google, но не нашел нужной информации.Вот что я попробовал:

     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 ]

5 голосов
/ 04 октября 2011

JAX-WS позволяет генерировать клиента из WSDL веб-службы с помощью wsimport. Это сделает клиентский код намного проще. Вот пример учебник

0 голосов
/ 19 декабря 2012

Из того, что я заметил, демаршаллинг, возникающий в dispatch.invoke ответа, не заполняет тело, конверт и т. Д. Из SOAPMessage, а вместо этого создает внутреннее Document, которое связано с SOAPPart.

Если вы вызываете reply.writeTo(System.out) после вызова invoke, он выведет сообщение с полным ответом в консоль.

Вы можете просмотреть Document (в данном случае на самом деле rootElement) и получите свой 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 Узел
  • 2nd getFirstChild возвращает text Узел

Если вам нужен объект Document вместо Element объекта из SOAPPart, вам нужно привести SOAPPart к SOAPPartImpl:

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