2013-06-24 7 views
1

Я разрабатываю web-сервер GWT-клиент-сервер с использованием GWT-RPC; в основном это работает нормально, но я застрял в ошибке, получая ArrayList типа IsSerializable.GWT-RPC Необработанная ошибка 500status при получении ArrayList

Вот код для метода на стороне сервера:

public GWTInvoiceList listInvoices(String enterpriseID, int selection) { 
    try{ 
     logger.log("ISI getting a listy of invoices "+selection); 
     PlataccsUser pxuser = (PlataccsUser) getSession().getAttribute(PlataccsConstants.USER); 
     Enterprise enterprise= pxuser.getEnterprise(enterpriseID); 
     Clerk clerk= pxuser.getClerk(enterprise); 
     int i=0; 
     List<Invoice> invoices =Invoice.getInvoices(enterprise, clerk, selection); 
     GWTInvoiceList gwinvoices = new GWTInvoiceList(); 
     Iterator<Invoice> it = invoices.iterator(); 
     while (it.hasNext()){ 
      Invoice invoice = it.next(); 
      logger.log("ISI-listInvoices converting invoice "+invoice.getSystemInvoiceNumber()); 
      gwinvoices.add(convert(invoice, clerk)); 
     } 
     logger.log("ISI-lI, the invoice list is now ready and it lists "+gwinvoices.size()+" invoices"); 
     return gwinvoices; 
    }catch(Exception px){ 
     logger.log("ISI propblem getting invoice list", px); 
     return null; 
    } 
} 

Этот код выполняется без каких-либо исключений метания. Тип возврата GWTInvoiceList - это простая оболочка для ArrayList, и, как известно, тип GWTInvoice успешно сериализуется в других вызовах. Стороне клиента код:

public InvoiceList(PlataxTabPanel parent, GWTEnterprise gwtEnterprise, int list_selection_type) { 
    super(parent, gwtEnterprise.getName()); 
    topLabel.setText("List of Invoices"); 
    subHeader.setText("blah blah"); 
    invoiceService.listInvoices(gwtEnterprise.getEnterpriseID(), list_selection_type, invoiceListCallBack); 

    //table headers: 
    table.setWidget(0, 0, new ColumnHeaderLabel(LabelText.LIST_INVOICE_NUMBER_HEADER)); 
    table.setWidget(0, 1, new ColumnHeaderLabel(LabelText.LIST_INVOICE_CUSTOMER_HEADER)); 
    table.setWidget(0, 2, new ColumnHeaderLabel(LabelText.LIST_INVOICE_VALUE_DATE_HEADER)); 
    table.setWidget(0, 3, new ColumnHeaderLabel(LabelText.LIST_INVOICE_DUE_DATE_HEADER)); 
    table.setWidget(0, 4, new ColumnHeaderLabel(LabelText.LIST_INVOICE_STATUS_HEADER)); 
    table.setWidget(0, 5, new MoneyColumnHeaderLabel(LabelText.LIST_INVOICE_NET_HEADER)); 
    table.setWidget(0, 6, new MoneyColumnHeaderLabel(LabelText.LIST_INVOICE_TAX_HEADER)); 
    table.setWidget(0, 7, new MoneyColumnHeaderLabel(LabelText.LIST_INVOICE_TOTAL_HEADER)); 

} 


final AsyncCallback<GWTInvoiceList> invoiceListCallBack= new AsyncCallback<GWTInvoiceList>(){ 
    @Override 
    public void onSuccess(GWTInvoiceList invoices){ 
    Iterator<GWTInvoice> gwit = invoices.iterator(); 
    int row = 1; 
    while(gwit.hasNext()){ 
     GWTInvoice gwinvoice = gwit.next(); 
     table.setWidget(row, 0, new Label(gwinvoice.getUserno())); 
     table.setWidget(row, 1, new Label(gwinvoice.getCustomer().getName())); 
     table.setWidget(row, 2, new Label(DateTimeFormat.getFormat(DateFormats.SHORT_DATE_FORMAT).format(gwinvoice.getValueDate()))); 
     table.setWidget(row, 3, new Label(DateTimeFormat.getFormat(DateFormats.SHORT_DATE_FORMAT).format(gwinvoice.getDueDate()))); 
     table.setWidget(row, 4, new Label(gwinvoice.getStatus())); 
     table.setWidget(row, 5, new MoneyLabel(gwinvoice.getNet())); 
     table.setWidget(row, 6, new MoneyLabel(gwinvoice.getTax())); 
     table.setWidget(row, 7, new MoneyLabel(gwinvoice.getGross())); 
     row++; 
    } 
    } 

    @Override 
    public void onFailure(Throwable cause) { 
     //Debugging code 

     StackTraceElement[] st = cause.getStackTrace(); 
     String error = "get invoice list failed\n"; 

     error = error+cause.getClass().getName()+"\n"; 
     if (cause instanceof StatusCodeException){ 
      StatusCodeException sce=(StatusCodeException) cause; 
      int sc = sce.getStatusCode(); 
      error=error+"Status Code:"+ sc+"\n"; 
     } 
     for (int i=0; i<st.length; i++){ 
      error = error + st[i].toString()+ "\n"; 
     } 
     Window.alert(error); 
    } 
}; 

вызов всегда завершается с кодом 500 статуса и, следовательно, вызывает метод OnFailure внутреннего класса AsyncCallback.

Я немного затруднен, чтобы понять, почему, поскольку на сервере нет ошибки.

Проблема заключается одна из сериализации на стороне сервера, но я не могу видеть, где это откуда. Я переопределил OnAfterResponseSerialized, чтобы исследовать вещи, и он не вызывается - (он вызывается другими методами в том же классе реализации службы, поэтому зонд работает). Из javadocs processCall() должен вызывать исключение SerializationException. Мне нужно поймать его и посмотреть, что происходит.

+0

GWTInvoiceList реализует Serializable? имеет конструктор по умолчанию? примените эти два вопроса рекурсивно ко всем переменным, объявленным в GWTInvoiceList. – RoberMP

ответ

0

Что делает GWTInviceList код выглядеть?

Я предполагаю, что у вас нет конструктора без параметров для класса GWTInvoiceList.

+0

нет, это не так, 'пакет uk.co.platosys.plataccs.shared.boox; импорт java.io.Serializable; import java.util.ArrayList; import com.google.gwt.user.client.rpc.IsSerializable; общественного класса GWTInvoiceList расширяет ArrayList реализует Serializable, IsSerializable { \t/** \t * \t */ \t частный статический окончательный длинный serialVersionUID = 4065179521064190133L; \t/** \t * \t */ \t \t общественного GWTInvoiceList() { \t \t \t } } ' – ejoftheweb

+0

жаль, что код не форматировать очень очаровательно. Но, как вы видите, он не пропускает конструктор no-args. – ejoftheweb

+0

Вы также попробовали позвонить super(); от этого конструктора no-arg? – aglassman

0

Этот код:

/** 
* catches the SerializationException for forensic examination. 
*/ 
@Override 
public String processCall(String payload) throws SerializationException{ 
    try{ 
     return super.processCall(payload); 
    }catch(SerializationException se){ 
     logger.log("Xservlet serialisation excption", se); 
     throw se; 
    } 
} 

добавил в класс реализации сервиса ловит SerializationException, чтобы я мог проследить аномальным объект.

Смежные вопросы