Сложные объекты с веб-сервисом SOAP: ClassCastException

Я получаю ArrayList сложных объектов, используя библиотеку KSOAP2 на основе этот учебник:

И я могу получить массив объектов. Проблема в том, что в конверте есть только один объект... Когда я это делаю:

//...Call webservice
Vector<SoapObject> vectorOfSoapObject = (Vector<SoapObject>)envelope.getResponse();
//pass Vector to ArrayList

Он возвращает мне ClassCastException в этой строке, когда у меня есть только один объект на конверте. Когда у меня больше, все работает нормально (я сделал отладку, чтобы увидеть, как это происходит)...

В чем может быть проблема?


person amp    schedule 01.06.2012    source источник


Ответы (2)


Я смог решить эту проблему. Используя предложение @Pranalee, я сделал это:

//call webservice
Object o1 = envelope.getResponse();
if(o1 == null){//no devices updated
    Log.d("GetUpdatesThread","o1==null");
} else if(o1.getClass().toString().equals(new SoapObject("", "").getClass().toString())){//one device updated
    Log.d("GetUpdatesThread","class -- soapObject");
    SoapObject result = (SoapObject) envelope.getResponse();
    Device d = convertToDevice(result);
    devicesUpdated.add(d);
} else if (o1.getClass().toString().equals(new Vector().getClass().toString())){//more than one device updated
    Log.d("GetUpdatesThread","class -- vector");
    Vector<SoapObject> vectorOfSoapObject2 = (Vector<SoapObject>)envelope.getResponse();
    for (SoapObject soapObject : vectorOfSoapObject2) {
         Device d = convertToDevice(soapObject);
         devicesUpdated.add(d);
    }  
}
person amp    schedule 04.06.2012
comment
Является ли convertToDevice настраиваемым методом, который вы написали для разбора SoapObject и заполнения Device? - person capdragon; 29.12.2012

Может случиться так, что когда есть более одной записи, сервис возвращает Vector<SoapObject>, а когда есть только запись, он возвращает только SoapObject.
Вы пытаетесь преобразовать SoapObject в Vector<SoapObject>, поэтому ClassCastException.
Это проблема с реализацией сервиса. Однако, чтобы исправить это на вашем конце, вы должны сначала получить envelope.getResponse() как Object и проверить, является ли Object экземпляром Vector<SoapObject> или SoapObject перед приведением.

Vector<SoapObject> vectorOfSoapObject = null;
Object response = envelope.getResponse();

if( response instanceof Vector){
   Vector<SoapObject> vectorOfSoapObject = (Vector<SoapObject>) response;       
}else if(response instanceof  SoapObject){
    //cast single object
   SoapObject soapObject = (SoapObject) response;
   //initialize vector
   vectorOfSoapObject = new Vector<SoapObject>();
   //add single object to vector. 
   vectorOfSoapObject.add(soapObject);
}

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

person Pranalee    schedule 01.06.2012
comment
Привет! И как я могу проверить, является ли экземпляр Vector<SoapObject> или SoapObject? - person amp; 01.06.2012
comment
используя instanceof оператора. Обновлен ответ с фрагментом кода - person Pranalee; 05.06.2012