Проблема с получением / чтением ответа Web-сервиса в Axis 1.4 - PullRequest
2 голосов
/ 09 ноября 2010

Я использую Axis 1.4 для создания клиента веб-сервиса, потому что сервис использует кодировку RPC. Я автоматически сгенерировал код клиента с помощью wsdl2java на основе предоставленного файла wsdl. Я не могу получить wsdl от самой службы, используя? Wsdl, добавленный к URL службы, потому что он не принимает запросы GET.

Когда я пытаюсь получить доступ к сервису через клиента, он сначала регистрирует это исключение:

DEBUG org.apache.axis.ConfigurationException  - Exception: 
org.apache.axis.ConfigurationException: No service named GetSettings is available

Я читал в других постах, что не о чем беспокоиться. Однако, если бы я мог избавиться от этого, было бы неплохо. Мой класс клиента выглядит следующим образом (try / catches удален):

private String endpoint = "http://<IP>/ToolsServlet/";

private ToolsServiceLocator locator;
private ToolsPort service;

public ToolsClient()
{
    locator = new ToolsServiceLocator();        
    URL url = new URL(endpoint);
    service = locator.getToolsService(url);            
}

public SwitchSettingsType getProvisionedSettings(String value)
{
    SettingsType settings = service.getSettings(value);

    return settings;
}

Моя настоящая проблема заключается в том, что я получаю исключения, пытающиеся разобрать ответ. Например:

INFO: 13:59:17,361 [http-thread-pool-8080-(2)] ERROR org.apache.axis.client.Call  - Exception:
java.lang.NumberFormatException: Invalid boolean
    at org.apache.axis.encoding.ser.SimpleDeserializer.onEndElement(SimpleDeserializer.java:180)
    at org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:502)
...

Caused by: java.lang.NumberFormatException: Invalid boolean
    at org.apache.axis.encoding.ser.SimpleDeserializer.makeBasicValue(SimpleDeserializer.java:270)
    at org.apache.axis.encoding.ser.SimpleDeserializer.makeValue(SimpleDeserializer.java:209)
    at org.apache.axis.encoding.ser.SimpleDeserializer.onEndElement(SimpleDeserializer.java:172)
    ... 40 more

При входе в систему на уровне отладки этому исключению предшествует регистрация запроса и следующих строк:

DEBUG org.apache.axis.transport.http.HTTPSender  - POST /ToolsServlet/ HTTP/1.0
Content-Type: text/xml; charset=utf-8
Accept: application/soap+xml, application/dime, multipart/related, text/*
User-Agent: Axis/1.4
Host: <IP>
Cache-Control: no-cache
Pragma: no-cache
SOAPAction: "GetSettings"
Content-Length: 479
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:GetSettings soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:tools"><value xsi:type="xsd:string">value</value></ns1:GetSettings></soapenv:Body></soapenv:Envelope>
DEBUG org.apache.axis.transport.http.HTTPSender  - HTTP/1.1 200 OK
DEBUG org.apache.axis.transport.http.HTTPSender  - Date Mon, 08 Nov 2010 20:59:12 GMT
DEBUG org.apache.axis.transport.http.HTTPSender  - Server Apache/2.0.53 (Unix) DAV/2
DEBUG org.apache.axis.transport.http.HTTPSender  - Connection close
DEBUG org.apache.axis.transport.http.HTTPSender  - Content-Type text/xml
DEBUG org.apache.axis.SOAPPart  - Enter: SOAPPart ctor(FORM_INPUTSTREAM)
DEBUG org.apache.axis.i18n.ProjectResourceBundle  - org.apache.axis.i18n.resource::handleGetObject(setMsgForm)
DEBUG org.apache.axis.SOAPPart  - Setting current message form to: FORM_INPUTSTREAM (currentMessage is now org.apache.axis.transport.http.SocketInputStream)
DEBUG org.apache.axis.SOAPPart  - Exit: SOAPPart ctor()
DEBUG org.apache.axis.i18n.ProjectResourceBundle  - org.apache.axis.i18n.resource::handleGetObject(no00)
DEBUG org.apache.axis.transport.http.HTTPSender  - 
no Content-Length
DEBUG org.apache.axis.i18n.ProjectResourceBundle  - org.apache.axis.i18n.resource::handleGetObject(xmlRecd00)
DEBUG org.apache.axis.transport.http.HTTPSender  - 
XML received:

Мне кажется, я не получаю должного ответа. Я протестировал прямую публикацию с веб-сервисом, используя Firefox и аддон Poster. Я использовал SOAP-сообщение / запрос, сгенерированный моим клиентом, и получил верный ответ.

Правильно ли я читаю логи в том, что Ось думает, что есть пустой ответ? Если да, есть ли у кого-нибудь предложения по поводу того, почему Axis не получает ответ или неправильно его читает? Я не вижу в журналах ничего другого, что дает какую-либо подсказку.

Запустить обновление один

Похоже, что я получаю ответ, даже если он не зарегистрирован в этом месте, но дальнейшие операторы журнала показывают попытки разобрать ответ через DeserializationContext. Axis создает исключение NumberFormatException, поскольку ожидает '0', 'f' or 'F' для false и '1', 't' or 'T' для true. Он не любит 'true' или 'false', которые действительно деформированы, поскольку wsdl определяет элементы как xsd: boolean, а допустимые значения: 'true' и 'false'.

Кроме обновления исходного кода для правильной обработки 'true' и 'false', есть ли какие-либо предложения по обеспечению работы Axis?

ТИА

Окончание первого обновления

Начать обновление два

Свежие глаза помогут на следующий день. Код Axis обрабатывает true и false, потому что он получает первый символ строки. Проблема в том, что я получаю неверные данные.

Окончание обновления два

...