如何从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)
请帮忙。
答案 0 :(得分:2)
我暂时没有使用Axis2,但这应该相当接近。
此代码:
stub._getServiceClient().getLastOperationContext().
getMessageContext("In").getEnvelope()
返回Axiom SoapEnvelope(Axiom是Axis2的内部XML处理引擎)。
Axiom是一段相当复杂的代码,在构建时考虑了一些优化。特别是
SoapEnvelope
)而实际上甚至不解析XML树。这是性能和内存的增益,特别是对于复杂的SOAP消息(例如MTOM)。 在这种情况下,调用" toString"是可以理解的。有一些限制。
应该注意的是,没有理由调用" toString"在SOAP信封上实际上应该返回序列化的SOAP消息(有或没有协议头,是加密的XML消息的加密或解密版本吗?)。
但是假设它确实返回了SOAP Envelope的XML消息,Axiom和Axis必须小心,因为Axiom 的缓存能力。
如果您的Axiom解析器处于非缓存模式,请调用" toString"将以一次性方式将整个响应解析为文本,这意味着您以后无法再次访问它。这是一种危险的行为。因此,默认情况下,它是被禁止的,并且它会因您的异常而失败。
但并非一切都没有丢失。 Axiom的SOAP Envelope实现了Axiom的可序列化类型,允许您在有或没有元素缓存的情况下控制序列化。
因此,您可以使用以下代码(根据您的具体情况进行调整):
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)
你可以按照这个理解