如何从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)
请为此提供帮助。
我一段时间没有使用Axis2,但这应该相当接近。
此代码:
stub._getServiceClient().getLastOperationContext().
getMessageContext("In").getEnvelope()
返回Axiom soapenvelope(Axiom是Axis2的内部XML处理引擎)。
Axiom是一个非常复杂的代码,构建了一些优化。特别是
- 它能够返回XML对象(作为
SoapEnvelope
),而无需实际解析XML树。这是性能和内存的增长,尤其是对于复杂的肥皂消息(例如MTOM)。 - 它只能解析XML消息的某些部分,而完全跳过其他部分
- 它能够以火灾和忘记方式解析(例如,阅读每个XML标签,并以Stax事件的形式报告它们),或者在解析它们时缓存它们,在其上构建DOM表示飞,可以一遍又一遍地访问。
在这种情况下,称为" toString"有一些局限是可以理解的。
应该指出,没有理由在肥皂信封上调用" Tostring"实际上应该完全返回序列化的肥皂消息(是否有或没有协议标头,这是否是加密或解密的加密版本的XML消息?...)。
但是,假设它确实返回了肥皂信封的XML消息,即轴和轴,则必须谨慎对待它,由于Axiom的缓存能力。。
如果您的公理解析器处于非缓存模式,则称" ToString"为单一的方式将整个响应作为文本解析,这意味着您以后再也无法再次访问它。这是一种危险的行为。因此,默认情况下,它是禁止的,并且在您的例外情况下失败。
,但一切都没有丢失。Axiom的SOAP信封实现了公理的可序列化类型,使您可以在有或没有元素缓存的情况下控制序列化。
例如序列化方法
因此,您可以使用以下代码(将其适应您的特定情况):
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();
您可以在此之后得到想法
服务项目和客户项目