Zak*_*Zak 3 java axis web-services
我正在从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:
Run Code Online (Sandbox Code Playgroud)
例外情况并不总是一样的.有时它会在响应中指定一个特定元素:
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:
Run Code Online (Sandbox Code Playgroud)
我正在进行的Web服务调用返回大量数据.如果我将服务器配置为返回较少的数据,则呼叫成功完成.
注意:虽然我没有得到任何客户端超时异常,但我尝试将超时值增加到五分钟,但这没有任何效果.
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>
Run Code Online (Sandbox Code Playgroud)
相关设置是名为"http"的传输.大多数应用程序服务器已经在其类路径中加载了此类,以防您不需要将Apache Commons HTTP jar添加到类路径中.