如何使用axis2从SOAP Web服务获取xml响应作为String

时间:2017-02-17 09:52:40

标签: java xml web-services soap axis2

如何从SOAP webservice获取xml响应(我正在使用Axis2)。我尝试了很多东西,但没有任何东西可以用来做出回应。我试过下面的

stub._getServiceClient().getLastOperationContext().
      getMessageContext("In").getEnvelope().toString();

它给予例外:

Exception : java.lang.IllegalStateException:
Can't process next node because caching is disabled at
org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:176)

请帮忙。

2 个答案:

答案 0 :(得分:2)

我暂时没有使用Axis2,但这应该相当接近。

此代码:

stub._getServiceClient().getLastOperationContext().
            getMessageContext("In").getEnvelope()

返回Axiom SoapEnvelope(Axiom是Axis2的内部XML处理引擎)。

Axiom是一段相当复杂的代码,在构建时考虑了一些优化。特别是

  • 它能够返回XML对象(就像SoapEnvelope)而实际上甚至不解析XML树。这是性能和内存的增益,特别是对于复杂的SOAP消息(例如MTOM)。
  • 它只能解析XML消息的某些部分,并完全跳过其他部分
  • 它能够以火灾和忘记的方式解析它(例如,读取每个XML标记,并在运行中报告它们,例如作为Stax事件),或者在解析它们时缓存它们,在它上构建DOM表示飞,可以一遍又一遍地访问。

在这种情况下,调用" toString"是可以理解的。有一些限制。
应该注意的是,没有理由调用" toString"在SOAP信封上实际上应该返回序列化的SOAP消息(有或没有协议头,是加密的XML消息的加密或解密版本吗?)。 但是假设它确实返回了SOAP Envelope的XML消息,Axiom和Axis必须小心,因为Axiom 的缓存能力。

如果您的Axiom解析器处于非缓存模式,请调用" toString"将以一次性方式将整个响应解析为文本,这意味着您以后无法再次访问它。这是一种危险的行为。因此,默认情况下,它是被禁止的,并且它会因您的异常而失败。

但并非一切都没有丢失。 Axiom的SOAP Envelope实现了Axiom的可序列化类型,允许您在有或没有元素缓存的情况下控制序列化。

例如serialize method

因此,您可以使用以下代码(根据您的具体情况进行调整):

SOAPEnvelope env = ... // your enveloppe
boolean withCaching = true; // If you want you env object to remain useable later, false if you do not care and want to save memory
StringWriter xmlMessageWriter = new StringWriter();
XMLStreamWriter serializationTarget = XMLOutputFactory.newFactory().createXMLStreamWriter(xmlMessageWriter);
env.serialize(serializationTarget, withCaching);
String soapEnvelopeAsString = xmlMessageWriter.toString();

答案 1 :(得分:0)

你可以按照这个理解

Service ProjectClient Project