2012-03-02 9 views
13

Ha pasado un tiempo desde que he estado haciendo GWT y necesitaba algo pequeño hecho rápidamente. Configuré las cosas y ahora tengo un RPC que necesito, pero falla.GWT - RPC SerializationException

Se supone que el RPC me da una ArrayList, y la vacante se encuentra en # projectname # .client.model. La llamada se realiza en # projectname # .client.model.
Las interfaces para mis Servicios se encuentran en # project # name.client.Service.
Finalmente, las llamadas por supuesto van a # projectname # .server.
La vacante implementa IsSerializable. La excepción que recibo de funcionamiento de mi RPC es el siguiente:

Starting Jetty on port 8888 
[WARN] Exception while dispatching incoming RPC call 
com.google.gwt.user.client.rpc.SerializationException: Type 'firsteight.client.model.Vacancy' was not included in the set of types which can be serialized by this SerializationPolicy or its Class object could not be loaded. For security purposes, this type will not be serialized.: instance = [email protected] 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:619) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.client.rpc.core.java.util.Collection_CustomFieldSerializerBase.serialize(Collection_CustomFieldSerializerBase.java:44) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serialize(ArrayList_CustomFieldSerializer.java:39) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:51) 
    at com.google.gwt.user.client.rpc.core.java.util.ArrayList_CustomFieldSerializer.serializeInstance(ArrayList_CustomFieldSerializer.java:28) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:740) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:621) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:126) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter$ValueWriter$8.write(ServerSerializationStreamWriter.java:153) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:539) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616) 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:474) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:571) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 

la RPC que hago es la siguiente:

void getVacs() { 
    try { 
     homeService.getVacancies(new AsyncCallback<ArrayList<Vacancy>>() { 
      public void onFailure(Throwable caught) 
      { 
       RootPanel.get("grayblock").add(new HTML("Failed:" + caught.getMessage())); 
      } 

      public void onSuccess(ArrayList<Vacancy> result) 
      { 
       RootPanel.get("grayblock").add(new HTML(result.get(0).getTitle())); 
      } 
     }); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

pensé que había hecho todo lo que necesitaba para hacer la vacante Serializable, y un ArrayList de vacante como returntype para el RPC cuenta como vacante como tipo de devolución ... ¿verdad? ¿Qué estoy haciendo mal?

¡Gracias de antemano!

+0

¿está seguro de que 'implementa'ed' com.google.gwt.user.client.rpc.IsSerializable' en su clase 'Vacancy'? com.google.gwt.user.client.rpc.IsSerializable –

+1

'importación;' ' vacante clase pública implementa IsSerializable {' Absolutamente. –

Respuesta

30

Esto normalmente se produce al usar una clase no serializable, que puede ocurrir si su clase no implementa com.google.gwt.user.client.rpc.IsSerializable o si se olvidó de agregar un constructor vacío.

Para pasar un grano que tiene que cumplir los siguientes requisitos (de GWT sitio):

  1. Se implementa cualquiera de Java serializable o GWT IsSerializable interfaz, ya sea directamente, o porque deriva de una superclase que hace.
  2. Sus no finales, campos de instancia no transitorios son en sí mismos serializable
  3. Ha un constructor por defecto (sin argumentos) con cualquier acceso modificador (por ejemplo Foo privada() {} funcionará)

Incluso si se cumplen estos requisitos pueden suceder que GWT compilador decir:

no se incluyó en el conjunto de tipos que pueden ser serializado por esta SerializationPolicy o su objeto clase no podía cargue. Por razones de seguridad, este tipo no será serializado .: instancia = @

El problema puede deberse a diferentes causas. Aquí su lista de comprobación completa a utilizar para resolver el problema:

  1. Compruebe que la clase tiene un constructor por defecto (sin argumentos)
  2. Compruebe que la clase implementa Serializable o IsSerializable o implementa una interfaz que se extiende Serializable o extiende una clase que implementa Serializable
  3. Verifique que la clase se encuentre en un paquete *. cliente o ...
  4. Verifique, si la clase no está en el cliente.* paquete, que se compila en su definición de módulo GWT xml. Por defecto está presente. Si su clase está en otro paquete, debe agregarlo a la fuente. Por ejemplo, si su clase está bajo dominio. * Debe agregarlo a xml como. Tenga en cuenta que la clase no puede pertenecer al paquete del servidor. Más detalles en la página GWT: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Si está incluyendo la clase de otro proyecto GWT, debe agregar las heredades a la definición del módulo xml a . Por ejemplo, si su clase Foo está en el paquete com.dummy.domain, debe agregar a la definición del módulo. Más detalles aquí: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. Si va a incluir la clase de otro proyecto GWT lanzado como un frasco de verificar que el frasco contiene también el código fuente porque GWT recompilación también la fuente de Java para las clases pasa al cliente.

PD: copiado de http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/ porque el sitio no está disponible actualmente. Si desea leer el artículo original, búsquelo en google usando la URL anterior y léelo de la caché web de google.

+1

He incluido el siguiente constructor: 'public Vacancy() {}'. El objeto que recupero del servidor utiliza un constructor parametrizado, pero no creo que deba hacer ninguna diferencia ... (?) –

+0

puede compartir su clase que implementa la interfaz de RemoteService y la aplicación de objeto de transferencia de vacante –

+0

, actualmente con los datos de demostración: http://pastebin.com/f88rMZEJ Servicio: http://pastebin.com/Yt8piq1m asíncrono: http://pastebin.com/Lbuav4yr –

6

Una razón más para esta excepción era obsoleto javascript en el lado del navegador. Tuve que volver a cargar duro (CTRL + F5) el código y esta excepción desapareció.

0

me sale también este error cuando utilicé lista secundaria:

return myList.subList(fromIndex, toIndex); 
+0

¿Funciona si prueba 'return myList'? 'sublist' no debería cambiar el tipo devuelto. –

+0

myList no ha cambiado, pero quería obtener una sublista, así que lo hice con for loop (java 7) – paka

0

En mi caso hay algo de memoria caché en mi carpeta target que no se actualiza correctamente. Tuve que reconstruir el proyecto (Maven -> Update Project) y luego funcionó.

Cuestiones relacionadas