Сложные объекты с веб-сервисом SOAP: ClassCastException
Я получаю ArrayList сложных объектов с использованием библиотеки KSOAP2 на основе этого урока:
И я могу получить arrayList объектов. Проблема в том, что конверт имеет только один объект... Когда я делаю:
//...Call webservice
Vector<SoapObject> vectorOfSoapObject = (Vector<SoapObject>)envelope.getResponse();
//pass Vector to ArrayList
Это возвращает мне ClassCastException
на этой линии, когда у меня есть только один объект на конверте. Когда у меня есть больше, это работает отлично (я сделал отладку, чтобы увидеть это происходит)...
В чем может быть проблема?
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);
}
}
Может случиться так, что когда существует более одной записи, сервис возвращает 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);
}
Таким образом, вам не придется изменять другой код, который вы могли бы написать, предполагая, что вы всегда будете получать список