GWT:响应无法反序列化

mar*_*osh 6 gwt gwt2

我正在使用GWT(2.4)和Spring集成,如本文所述.从数据库(Hibernate)获取User列表并使用它填充DataGrid时遇到问题.当我调用greetingService.allUsers()方法时,我收到错误(onFailure()):

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException:无法反序列化响应

有人帮忙吗?下面是一些代码.完整的工作项目在这里.

  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);
            }
        }
    );
    // ...
 }
Run Code Online (Sandbox Code Playgroud)

GreetingServiceImpl

@Override
public List<User> allUsers() {
    return userDAO.findAll();
}
Run Code Online (Sandbox Code Playgroud)

用户

@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;
}
Run Code Online (Sandbox Code Playgroud)

Õzb*_*bek 6

IncompatibleRemoteServiceException的文档说:

此异常可能由以下问题引起:

  • 无法通过服务器上的{@link Class#forName(String)}找到请求的{@link RemoteService}.
  • 所请求的{@link RemoteService}接口未由配置为处理请求的{@link com.google.gwt.user.server.rpc.RemoteServiceServlet RemoteServiceServlet}实例实现.
  • 请求的{@link RemoteService}接口未定义或继承所请求的服务方法.

  • {@link RemoteService}方法调用中使用的其中一种类型已添加或删除了字段.
  • 客户端代码从服务器接收一个它无法
    反序列化的类型.

在你的情况下是最后一点,你有一个无法序列化和反序列化的类型,你的User类就是其中之一.您应该有一个传输对象,它实现com.google.gwt.user.client.rpc.IsSerializable了通过网络传输User对象的接口.有关详细信息,请参阅:与Java语言和库的兼容性.GWT RPC方法参数和返回类型必须通过网络在客户端和服务器应用程序之间传输,因此它们必须是可序列化的.


mar*_*osh 1

GwtRpcController我通过根据更新解决了我的问题。现在,反序列化可以很好地工作,无需使用任何传输对象。下面工作GwtRpcController

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

}
Run Code Online (Sandbox Code Playgroud)