kSoap2 Android - исключение класса Cast (SoapObject) - PullRequest
0 голосов
/ 27 апреля 2011

В настоящее время я пытаюсь получить массив из моего веб-сервиса, используя обычную реализацию Ksoap. Однако при попытке доступа к этому массиву я получаю следующую ошибку logcat:

 04-27 00:27:01.772: ERROR/AndroidRuntime(530): Caused by: java.lang.RuntimeException: Unable to 
 start activity ComponentInfo{android.waiter/android.waiter.TablesActivity}: 
 java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive

Похоже, что по какой-то причине Soap не ладит с тем, как я разыгрываю значения своих свойств. Прикрепленный код проблемы (и связанные методы)

public static TableDTO[] RetrieveFromSoap(SoapObject soap)
{
    TableDTO[] tables = new TableDTO[soap.getPropertyCount()];
    for (int i = 0; i < tables.length-1; i++) {
        SoapObject pii = (SoapObject) soap.getProperty(i);
        TableDTO table = new TableDTO();
        table.setTableID(Integer.parseInt(pii.getProperty(0).toString())); 
        table.setCapacity(Integer.parseInt(pii.getProperty(1).toString()));
        table.setStatusFlag(pii.getProperty(2).toString());
        table.setCurrentWaiter(pii.getProperty(3).toString());
        tables[i] = table;
    }
    return tables;
}

Информация TableDTO:

 @Override
public Object getProperty(int arg0) {
    switch(arg0)
    {
    case 0:
        return TableID;
    case 1:
        return Capacity;
    case 2:
        return StatusFlag;
    case 3:
        return currentWaiter;
    }
    return null;
}

@Override
public int getPropertyCount() {
    // TODO Auto-generated method stub
    return 3;
}

@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) {
    switch(arg0){
    case 0:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "TableID";
        break;
    case 1:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "Capacity";
        break;
    case 2:
        info.type = PropertyInfo.STRING_CLASS;
        info.name = "StatusFlag";
        break;
    case 3:
        info.type = PropertyInfo.INTEGER_CLASS;
        info.name = "currentWaiter";
        break;
default:break;
    }       

}

@Override
public void setProperty(int arg0, Object value) {
    switch(arg0)
    {
    case 0:
        TableID = Integer.parseInt(value.toString());
        break;
    case 1:
        Capacity = Integer.parseInt(value.toString());
        break;
    case 2:
        StatusFlag = value.toString();
        break;
    case 3:
        currentWaiter = value.toString();
        break;
    default :
        break;

    }

}

Проблема с линией

 SoapObject pii = (SoapObject) soap.getProperty(i);

Ему не нравится там кастинг. Я не знаю, как это исправить.

Спасибо за ваше время и помощь!

1 Ответ

15 голосов
/ 27 апреля 2011

Вместо использования

SoapObject response = (SoapObject)envelope.getResponse();

Используйте

SoapObject response = (SoapObject)envelope.bodyIn;

Это сработало для меня.

...