2012-01-20 15 views
6

Estoy usando GWT (2.4) con resorte integrado como en este article. Tengo un problema para obtener la lista de usuarios de la base de datos (Hibernate) y rellenar DataGrid con ella. Cuando llamo greetingService.allUsers() método, estoy recibiendo el error (onFailure()):GWT: La respuesta no pudo ser deserializada

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: La respuesta no se ha podido deserializar

¿Alguien ayuda con eso? Debajo algunos pedazos de código. El proyecto de trabajo completo es here.

public void onModuleLoad() { 
    // ... 
    greetingService.allUsers(
     new AsyncCallback<List<User>>(){ 
      @Override 
      public void onFailure(Throwable caught) { 
       caught.printStackTrace(); 
      } 
      @Override 
      public void onSuccess(List<User> result) { 
       GWT.log("SIZE: "+result.size()); 
       dataGrid.setRowData(result); 
      } 
     } 
    ); 
    // ... 
} 

GreetingServiceImpl

@Override 
public List<User> allUsers() { 
    return userDAO.findAll(); 
} 

usuario

@Entity 
@Table(name = "users") 
public class User implements Serializable, IsSerializable { 

    @Id 
    private Long id; 

    // only Strings and one Date 
    private String login; 
    private String password; 
    private String firstname; 
    private String lastname; 
    private Date date; 
} 

Respuesta

1

Resolví mi problema actualizando GwtRpcController según this. Ahora la deserialización funciona bien sin usar ningún objeto de transferencia. Trabajando GwtRpcController a continuación.

import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.context.ServletContextAware; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.Controller; 
import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException; 
import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.SerializationException; 
import com.google.gwt.user.server.rpc.RPC; 
import com.google.gwt.user.server.rpc.RPCRequest; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

public class GwtRpcController extends RemoteServiceServlet implements 
     Controller, ServletContextAware { 

    private static final long serialVersionUID = 1L; 

    private ServletContext servletContext; 

    private RemoteService remoteService; 

    private Class remoteServiceClass; 

    public ModelAndView handleRequest(HttpServletRequest request, 
      HttpServletResponse response) throws Exception { 
     super.doPost(request, response); 
     return null; 
    } 

    @Override 
    public String processCall(String payload) throws SerializationException { 
     try { 

      RPCRequest rpcRequest = RPC.decodeRequest(payload, this.remoteServiceClass, this); 
      onAfterRequestDeserialized(rpcRequest); 

      // delegate work to the spring injected service 
      return RPC.invokeAndEncodeResponse(this.remoteService, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest.getSerializationPolicy()); 
     } catch (IncompatibleRemoteServiceException ex) { 
      getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex); 
      return RPC.encodeResponseForFailure(null, ex); 
     } 
    } 

    @Override 
    public ServletContext getServletContext() { 
     return servletContext; 
    } 

    @Override 
    public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
    } 

    public void setRemoteService(RemoteService remoteService) { 
     this.remoteService = remoteService; 
     this.remoteServiceClass = this.remoteService.getClass(); 
    } 

} 
6

Documentación para IncompatibleRemoteServiceException dice:

Esta excepción puede ser causada por los siguientes problemas:

  • El {Remote RemoteService} solicitado no se puede encontrar a través de {@link Class # forName (String)} en el servidor.
  • El {@ link} RemoteService interfaz solicitado no está implementado por la instancia {@ link com.google.gwt.user.server.rpc.RemoteServiceServlet RemoteServiceServlet} que está configurado para procesar la solicitud .
  • El método de servicio solicitado no está definido o heredado por la interfaz {@link RemoteService} solicitada.

  • Uno de los tipos utilizados en la invocación del método {@link RemoteService} ha agregado o eliminado campos.
  • El cliente código recibe un tipo del servidor que no puede
    deserializar.

en su caso es el último punto, tiene un tipo que no puede ser serializado y deserializar, eso es una clase User es uno de ellos. Debería tener un objeto de transferencia que implemente la interfaz com.google.gwt.user.client.rpc.IsSerializable para transmitir el objeto Usuario a través de la red. Para obtener más información, consulte: Compatibility with the Java Language and Libraries. Los parámetros del método GWT RPC y los tipos de retorno se deben transmitir a través de una red entre las aplicaciones cliente y servidor y, por lo tanto, deben ser serializable.

2

Intentaría un par de cosas.

  • En usuario implementan sólo com.google.gwt.user.client.rpc.IsSerializable y añadir un constructor blanco. Recuerdo haber leído hace mucho tiempo que esto es necesario y resolvió un problema como este en uno de mis proyectos. public User() { }
  • Asegúrese de que su paquete esté definido en su archivo gwt.xml.

No está haciendo nada más complicado que no pueda ser serializado, por lo que debería estar bien con eso.

+0

Oh, eso temió que ningún constructor de arg me haya conseguido tantas veces ... Puede ser privado. – DTing

+0

Tengo contructor en blanco. ¿A qué se refiere con: _ "Asegúrese de que su paquete esté definido en su archivo gwt.xml" _? – marioosh

+0

En su proyecto, tendrá un archivo .gwt.xml en la base del src. Allí abajo, verás de lo que estoy hablando. Aquí hay un enlace útil: [Paths Handling] (http://code.google.com/p/google-web-toolkit-incubator/wiki/PathsHandlingFAQ) –

0

Todo, Pasamos mucho tiempo con esto, y tengo una solución diferente. Estaba usando una configuración muy simple y mis POJO no eran más que miembros y un CTOR.

Recreé un nuevo proyecto de GWT y agregué mis cosas al nuevo proyecto, agregando cada dependencia de POM.xml nuevamente. Lo que encontré fue que el compilador de maven estaba demasiado alto. Había copiado esto en otro proyecto de no pensar en ello ... lado del cliente GWT es prácticamente sólo 1,5, tal vez 1.6 compatibles ... así que estos ajustes deben fijarse a 1,5, no 1,7

<plugin> 
<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-compiler-plugin</artifactId> 
<version>2.3.2</version> 
<configuration> 
    <source>1.7</source>      <!-- change these to 1.5 --> 
    <target>1.7</target> 
</configuration> 
</plugin> 
0

I tuvo ese error al usar guava-gwt con el alcance "provisto". Para satisfacer las dependencias durante el tiempo de ejecución, agregué google-collections. El cliente de GWT no pudo deserializar esos.

Solución: eliminar la dependencia de Google-colecciones, y seguir con la guayaba.

0

Para problemas con objetos serializables, puede probar esta lista de comprobación:

  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 se extiende una clase que implementan Serializable
  3. Compruebe que la clase está en un cliente. * paquete o ...
  4. Verify, si la clase es n ot en el paquete client *, que se compila en su definición de módulo GWT xml. Por defecto está presente. Si su clase está en otro paquete, debe agregarla 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 sobre GWT página: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
  5. Si va a incluir la clase de otro proyecto GWT hay que añadir los hereda a su definición de módulo XML. Por ejemplo, si su clase Foo se encuentra en el paquete com.dummy.domain, debe agregarla 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 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.

Fuente: http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/

0

estoy trabajando en un equipo con software maduro el que algún día dejó de funcionar para mí debido a este error. El resto del equipo estaba bien. Intentamos varias cosas arreglarlo.Eventualmente, reinstalamos IntelliJ y eso lo solucionó.

0

A veces, este error puede deberse a archivos/caché obsoletos/corruptos del lado del cliente (en este caso, no hay ningún mensaje de error del lado del servidor). Acabo de ejecutar el "módulo de reconstrucción" en IntelliJ y estaba bien de nuevo.

Cuestiones relacionadas