SAXParseException:XML文档结构必须在同一实体中开始和结束

时间:2011-09-05 10:15:56

标签: java web-services axis

我正在从Apache Axis 1.4 Java客户端调用Web服务。呼叫正确到达服务器,但客户端在大约几分钟后抛出此异常:

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXParseException: XML document structures must start and end within the  same entity.
faultActor:
faultNode:
faultDetail:

异常并不总是一样的。有时它会在响应中指定一个特定元素:

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: org.xml.sax.SAXParseException: The element type "name" must be terminated by the matching end-tag "</name>".
faultActor:
faultNode:
faultDetail:

我正在进行的Web服务调用会返回大量数据。如果我将服务器配置为返回较少的数据,则呼叫成功完成。

注意:虽然我没有得到任何客户端超时异常,但我尝试将超时值增加到五分钟,但这没有效果。

1 个答案:

答案 0 :(得分:5)

Apache Axis 1.4默认支持HTTP 1.0。被调用的服务器正在使用HTTP 1.1,它显然支持Chunked Transfer Encoding。

来自w3.org

  

分块编码修改消息正文,以便将其作为一系列块传输,每个块都有自己的大小指示符,然后是包含实体标题字段的可选预告片。这允许动态生成的内容与收件人验证其已收到完整邮件所需的信息一起传输。

这意味着Axis 1.4对HTTP响应中的块没有任何了解,并且可能在接收所有块之前关闭连接。当它试图反序列化SOAP消息时,它抱怨XML没有很好地形成并且缺少一些结束标记,这是预期的,因为它没有完整的SOAP响应。

解决方案是将Axis配置为使用默认支持HTTP 1.1的CommonsHTTPSender。您可以通过在org / apache / axis / client / client-config.wsdd下的类路径中添加client-config.wsdd来执行此操作,其中包含以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<deployment name="ApacheCommonsHTTPConfig" xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

 <globalConfiguration>

  <parameter name="disablePrettyXML" value="true"/>

  <parameter name="enableNamespacePrefixOptimization" value="false"/>

 </globalConfiguration>

 <transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" />

 <transport name="local" pivot="java:org.apache.axis.transport.local.LocalSender" />

 <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" />

</deployment>

相关设置是名为“http”的传输。 大多数应用程序服务器已在其类路径中加载此类,以防您不需要将Apache Commons HTTP jar添加到类路径中。