Из того, что я заметил, демаршаллинг, возникающий в 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();