Получение ClassCastException из моего следующего метода итератора

Я использую Spring 3.1.0, Hibernate 4, JDK 7 для Tomcat 7 и получаю исключение ClassCastException в методе itr.next(). Объект aaData действительно содержит данные.

List<CustomerList> aaData = customerlistDaoimpl.getCustomerList();

/*
 * putting data in a JSON form that DataTables recognizes
 */
String data = "{\"sEcho\": 3, \"iTotalRecords\": " + count + ",\"iTotalDisplayRecords\": " + count + ",\"aaData\": [ ";
Iterator<CustomerList> itr = aaData.iterator();
while(itr.hasNext()){
    CustomerList cl = (CustomerList) itr.next();
    data += "[\"" + cl.getName() + "\",\"" + cl.getAddress() + "\",\"" + cl.getZipcode() + "\",\"" + 
    cl.getPhone() + "\",\"" + cl.getCity() + "\",\"" + cl.getCountry() + "\",\"" + cl.getNote() + "\" ] ";
    count++;
}
data += "]}";

Мое Дао

@SuppressWarnings("unchecked")
@Override
public List<CustomerList> getCustomerList() {
    List<CustomerList> cuList = null;
    Session session = null;

    try{
        session = sessionfactory.openSession();
        session.beginTransaction();         
        cuList = session.createSQLQuery("select * from customer_list").list();      
        session.getTransaction().commit();
    }catch (RuntimeException e){
        System.out.println(e.getMessage());
    }
    finally
    {
        if(session != null){
            session.close();                
        }
    }

    return cuList;
}

И след назад

СЕРЬЕЗНЫЙ: Servlet.service() для сервлета [sptestjs] в контексте с путем [/SPTestJs] вызвал исключение [Ошибка обработки запроса; вложенным исключением является java.lang.ClassCastException: [Ljava.lang.Object; нельзя привести к com.sptestjs.implementation.CustomerList] с основной причиной java.lang.ClassCastException: [Ljava.lang.Object; нельзя привести к com.sptestjs.implementation.CustomerList в com.sptestjs.implementation.controller.HomeController.getCustomerList(HomeController.java:85) в sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) в sun.reflect.NativeMethodAccessorImpl.invoke (Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (Неизвестный источник)

я нашел звонок

SQLQuery cuSQLQuery = session.createSQLQuery("select * from customer_list");

возвращает экземпляр SQLQuery, и его список имеет тип ArrayList элементов Object, где

Query cuQuery = session.createQuery("from customer_list");

возвращает null.


person user931501    schedule 02.08.2013    source источник
comment
Какое полное исключение? (Я ожидаю, что он расскажет вам, каково было фактическое значение.) Кстати, вам следует настоятельно рассмотреть возможность использования StringBuilder для добавления данных здесь, а не многократное использование +=.   -  person Jon Skeet    schedule 02.08.2013
comment
Это просто означает, что customerlistDaoimpl.getCustomerList() возвращает не List‹CustomerList›, а список чего-то другого. Если бы у нас была трассировка стека и код этого метода, мы могли бы помочь.   -  person JB Nizet    schedule 02.08.2013
comment
Какой объект класса вернул itr.next()? Возможно ли, что это null?   -  person    schedule 02.08.2013
comment
Может оффтоп, но думаю будет полезно. Используйте Google GSON для создания выходного JSON. Это приведет к более элегантному и управляемому коду в вашем приложении.   -  person    schedule 02.08.2013
comment
Arrggh Я использую дженерики, из того, что я видел в GSON, требуется слишком много накладных расходов, я использую библиотеки Джексона и Spring, чтобы вернуть JSON во внешний интерфейс, просто вернуть список - это все, что требуется, передавая данные вернуться к вызову ajax, который есть.   -  person user931501    schedule 03.08.2013
comment
жопа для += у разработчика много вариантов :}   -  person user931501    schedule 03.08.2013


Ответы (4)


Получение ClassCastException из моего следующего метода итератора

Это означает, что вы aaData на самом деле не являетесь List<CustomerList> У вас есть стирание типа где-то, вы неправильно изменили его тип. Если вы внимательно посмотрите на ClassCastException, он скажет вам, какой на самом деле тип компонента.

java.lang.ClassCastException: [Ljava.lang.Object; нельзя привести к com.sptestjs.implementation.CustomerList

Это предполагает, что тип на самом деле должен быть

List<Object[]> cuList = session.createSQLQuery("select * from customer_list").list(); 
person Peter Lawrey    schedule 02.08.2013
comment
Вызов cuList = session.createSQLQuery(select * from customer_list).list(); в моем dao возвращает ArrayList элементов Object, и приведение, конечно, не имеет никакого эффекта. - person user931501; 03.08.2013

Используйте дженерики .aaData может содержать неверные данные

class CustomerlistDaoimpl{

public  List<CustomerList> getCustomerList(){
.....
}
}

    List<CustomerList> aaData = customerlistDaoimpl.getCustomerList();

    String data = "{\"sEcho\": 3, \"iTotalRecords\": " + count + ",\"iTotalDisplayRecords\": " + count + ",\"aaData\": [ ";
    Iterator<CustomerList> itr = aaData.iterator();
    while(itr.hasNext()){
        CustomerList cl = (CustomerList) itr.next();
        data += "[\"" + cl.getName() + "\",\"" + cl.getAddress() + "\",\"" + cl.getZipcode() + "\",\"" + 
        cl.getPhone() + "\",\"" + cl.getCity() + "\",\"" + cl.getCountry() + "\",\"" + cl.getNote() + "\" ] ";
        count++;
    }
    data += "]}";
person Rajesh    schedule 02.08.2013
comment
Я использую дженерики, как в List‹CustomerList› ?? - person user931501; 03.08.2013

Проверьте, совпадает ли полное имя класса для импортированного вами класса CustomerList с именем, которое вы использовали при заполнении списка. Мне любопытно, почему вам все равно нужно было выполнить приведение, учитывая, что вы используете дженерики - next() должен возвращать тот же тип, для которого создан итератор. Другими словами, Iterator всегда будет возвращать экземпляры T при вызове itr.next().

person Neel    schedule 03.08.2013
comment
Я сделал приведение только для того, чтобы посмотреть, будет ли это различаться, потому что next() возвращает тип объекта, что странно. Iterator‹T› не может установить значение CustomerList, и я не понимаю, почему. - person user931501; 04.08.2013
comment
Проблема в том, что createSQLQuery().list() возвращает ArrayList объектов, поэтому next() не может не возвращать тип объекта. Я пытался получить (0) в списке - person user931501; 04.08.2013
comment
createSQLQuery().list() возвращает список объектов ArrayList... не очень полезно... тогда дженерики не помогают... - person Neel; 08.08.2013

Решено:

Множественные ошибки, исключение вводило в заблуждение, я квалифицировал свой Dao impl с идентификатором sessionFactory, которого больше не существует, в то время как автоматическое подключение sessionFactory, которое когда-то было исправлено, для следующей ошибки. исправил их все, и проект запущен и работает.

person user931501    schedule 06.08.2013