SAXParseException: структуры документа XML должны начинаться и заканчиваться в пределах одной и той же сущности - PullRequest
3 голосов
/ 05 сентября 2011

Я звоню в веб-сервис из Java-клиента Apache Axis 1.4.Вызов достигает сервера правильно, но клиент выдает это исключение примерно через пару минут:

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:

Вызов веб-службы, который я выполняю, возвращает большой объем данных.Если я настрою сервер на возврат меньшего количества данных, вызов будет успешно завершен.

Примечание. Хотя я не получаю никаких исключений времени ожидания на стороне клиента, я попытался увеличить значение времени ожидания до пяти минутно это не имело никакого эффекта.

1 Ответ

5 голосов
/ 09 сентября 2011

Apache Axis 1.4 поддерживает HTTP 1.0 по умолчанию. Вызываемый сервер использует HTTP 1.1, который, очевидно, поддерживает Chunked Transfer Encoding.

С w3.org :

Кодировка чанков изменяет тело сообщения, чтобы передать его как серию чанков, каждый со своим собственным индикатором размера, за которым следует ДОПОЛНИТЕЛЬНЫЙ трейлер, содержащий поля заголовка объекта. Это позволяет передавать динамически создаваемый контент вместе с информацией, необходимой получателю для проверки того, что он получил полное сообщение.

Это означает, что Axis 1.4 ничего не знает о чанках в HTTP-ответе и, вероятно, закрывает соединение до получения всех чанков. Когда он пытается десериализовать сообщение SOAP, он жалуется на то, что XML не правильно сформирован и отсутствует какой-либо закрывающий тег, что ожидается, поскольку у него нет полного ответа SOAP.

Решение состоит в том, чтобы настроить Axis для использования CommonsHTTPSender, который по умолчанию поддерживает HTTP 1.1. Вы делаете это, добавляя client-config.wsdd в ваш classpath в org / apache / axis / client / 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 в ваш путь к классам.

...