GWT - RPC SerializationException

时间:2012-03-02 13:57:03

标签: java gwt rpc

自从我做GWT以来已经有一段时间了,我需要快速做一些小事。我设置了一些东西,现在我需要一个RPC,但它失败了。

RPC应该给我一个ArrayList,而Vacancy位于#projectname#.client.model中。 调用在#projectname#.client.model中进行。
我的服务的接口位于#project#name.client.Service中。
最后,调用当然是#projectname#.server。
空缺实现了IsSerializable。我从运行RPC获得的异常如下:

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 = firsteight.client.model.Vacancy@15fdd2f
    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)

我制作的RPC如下:

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

我以为我已经完成了所有我需要的Vacancy Serializable,并且一个空位的ArrayList作为RPC的返回类型算作具有Vacancy作为返回类型..对吗?我做错了什么?

提前致谢!

6 个答案:

答案 0 :(得分:32)

这通常是由于使用不可序列化的类引起的,如果您的类没有实现com.google.gwt.user.client.rpc.IsSerializable或者您忘记添加空构造函数,则可能会发生这种情况。

要传递bean,您必须满足以下要求(来自GWT站点):

  1. 它实现Java Serializable或GWT IsSerializable 接口,直接或因为它派生自超类 那样做。
  2. 其非最终的非瞬态实例字段本身 序列化
  3. 它有一个具有任何访问权限的默认(零参数)构造函数 修饰符(例如私有Foo(){}将起作用)
  4. 即使您满足这些要求,GWT编译器也可能会说:

      

    未包含在可以的类型集中   由此SerializationPolicy序列化或其Class对象不能   加载。出于安全考虑,此类型不会被序列化:   instance = @

    问题可能有不同的原因。这是他用来解决问题的完整检查清单:

    1. 验证该类是否具有默认构造函数(不带参数)
    2. 验证该类是否实现了Serializable或IsSerializable或 实现一个扩展Serializable或扩展类的接口 实现Serializable
    3. 验证该类是否在客户端。*包或...
    4. 验证,如果该类不在客户端。*包中,则编译为 您的GWT xml模块定义。默认情况下 存在。如果您的班级在另一个包中,则必须添加它 源。例如,如果您的课程属于域名。*您应该 将其添加到xml中。要知道这堂课 不能属于服务器包!有关GWT页面的更多详细信息: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml
    5. 如果您要从其他GWT项目中包括该课程,则必须这样做 将继承添加到xml模块定义中。例如,如果你的 class Foo在你必须添加的包com.dummy.domain中  到模块定义。 更多细节在这里: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
    6. 如果您要将其他GWT项目中的课程包括在内 jar验证jar还包含源代码,因为GWT 重新编译传递给客户端的类的Java源代码。
    7. PS:从http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/复制,因为该网站目前不可用。如果您想阅读原始文章,请使用上述网址从谷歌搜索,并从谷歌网络缓存中读取。

答案 1 :(得分:7)

此异常的另一个原因是浏览器端的过时javascript。我不得不重新加载(CTRL + F5)代码,这个例外消失了。

答案 2 :(得分:0)

当我使用子列表时,我也遇到了这个错误:

return myList.subList(fromIndex, toIndex);

答案 3 :(得分:0)

在我的情况下,我的target文件夹中有一些旧缓存没有正确更新。我不得不重建项目(Maven - &gt; Update Project),然后就可以了。

答案 4 :(得分:0)

首先,确保定义了一个空构造函数
如果没有,你的班级将无法序列化......

如果你有一个空构造函数,请确保你的类(或扩展链中的任何类)实现IsSerializable (或任何其他扩展IsSerialisable的接口)

如果您的班级实施了IsSerialisable,请检查非最终 ...

答案 5 :(得分:0)

如Cipous所述,在我的情况下,我在Pentaho BI Server的服务器输出中引发了此异常。一个简单的硬重装(CTRL + F5)就可以解决问题。