Search code examples
gwtgwt2

GWT: The response could not be deserialized


I'm using GWT (2.4) with Spring integrated as in this article. I have problem with getting list of User from database (Hibernate) and populate DataGrid with it. When i call greetingService.allUsers() method, I'm getting error (onFailure()):

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized

Anybody helps with that? Below some pieces of code. Full working project is 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();
}

User

@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;
}

Solution

  • I solved my problem by updating GwtRpcController according to this. Now deserialization works good without using any transfer object. Working GwtRpcController below.

    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();
        }
    
    }