java.lang.ClassCastException: java.util.Vector нельзя преобразовать в org.ksoap2.serialization.SoapPrimitive - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь подключить разработку моего Android-приложения к веб-службе и не могу перехватить ответ (выдает ошибку выше);следующий фрагмент кода моего приложения:

@Override
protected String doInBackground(String... params) {

    String URL = "https://MyDomain/Services/AccountManager.asmx";
    String NAMESPACE = "http://tempuri.org/";
    String METHOD_NAME = parameters.get("METHOD_NAME");
    String ReturnValue;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    // addProperty for each KeyPair in the Parameters HashMap
    for (Map.Entry<String, String> parameter : parameters.entrySet()) {
        if (!parameter.getKey().startsWith("_") && parameter.getKey() != "METHOD_NAME") {
        request.addProperty(parameter.getKey() , parameter.getValue());
        }
    }

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.implicitTypes = true;
    envelope.setOutputSoapObject(request);

    HttpTransportSE httpTransportSE = new HttpTransportSE(URL);

    try {
        httpTransportSE.call(NAMESPACE + METHOD_NAME, envelope);
        SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();
        ReturnValue = soapPrimitive.getAttribute("StatusCode").toString();
    } catch (Exception ex) {
        ReturnValue = "Error: " + ex.getMessage();
    }
    return ReturnValue;
}

Ошибка выдается строкой

SoapPrimitive soapPrimitive = (SoapPrimitive) envelope.getResponse();

Я прочитал ряд статей / сообщений, в которых предлагается изменить предыдущую строку, наследующая строка:

Object soapPrimitive = (Object) envelope.getResponse();

Несмотря на то, что это «обходит» ошибку, возвращаемые значения из службы затем не называются:

  1. OK
  2. 2119100
  3. 278
  4. E

... вместо того, чтобы быть в пригодном для использования "соединении";

response.getAttribute("AccountNumber") = 2119100
response.getAttribute("AccountBalance") = 278
response.getAttribute("StatusCode") = "E"

У меня есть контроль надвеб-сервис, поэтому там можно вносить изменения, если это решение;фрагмент кода C # для службы:

[WebMethod(
    Description = "Account Lookup", 
    MessageName = "Account",
    EnableSession = false)]
public string Account(
    string PostCode, 
    string Surname, 
    out double? AccountBalance, 
    out string AccountNumber, 
    out string StatusCode)
    {
        // MY STUFF HERE
        AccountBalance = 50;
        AccountNumber = 123456;
        StatusCode = "A";
        Return "OK";
    }

Выше приведена значительно урезанная версия фактической службы, которая (для производства) вернула бы [например] полную разбивку финансовойтранзакции с начальным сальдо, текущим сальдо, НДС, процентами, скидками и т. д., поэтому отслеживание неназванного проиндексированного списка постепенно станет кошмаром обслуживания.

[править 22/02/2019]

Я изменил (и упростил) WebService, чтобы он принимал ТОЛЬКО значения INPUT

[WebMethod(
    Description = "Account Lookup", 
    MessageName = "Account",
    EnableSession = false)]
public string Account(
    string PostCode, 
    string Surname)

.. и из этого метода я выполняю более глубокий вызов частного методаэто обрабатывало "out" параметры.Затем WebMethod превращает эти параметры в строку JSON и возвращает ее.Этот (довольно уродливый метод) работал до тех пор, пока я не захотел вернуть массив данных, который вернулся к исходной ошибке.

... следующим шагом (поскольку я не могу найти рабочее решение) будетпопробуйте то же самое с ответом XML.

1 Ответ

0 голосов
/ 15 февраля 2019

Возможно, envelope.getResponse() вызов возвращает коллекцию SoapPrimitive с.

Попробуйте что-то вроде

Vector responseVector = (Vector) envelope.getResponse();
for (Vector res : responseVector) {
    SoapPrimitive soapPrimitive = (SoapPrimitive) res;
    // your code here using soapPrimitives
}

Если тип элементов по-прежнему отличается от SoapPrimitive, появится новый Exception, и вы сможете соответственно разыграть его.

...