GWT - RPC SerializationException

问题描述 投票:13回答:6

自从我做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作为返回类型..对吗?我究竟做错了什么?

提前致谢!

java gwt rpc
6个回答
32
投票

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

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

  1. 它直接实现Java Serializable或GWT IsSerializable接口,或者因为它派生自一个超类。
  2. 它的非最终非瞬态实例字段本身是可序列化的
  3. 它有一个带有任何访问修饰符的默认(零参数)构造函数(例如私有Foo(){}将起作用)

即使您满足这些要求,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模块定义中。例如,如果您的类Foo位于包com.dummy.domain中,则必须添加到模块定义中。更多细节在这里:http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideInheritingModules
  6. 如果要包含来自另一个作为jar发布的GWT项目的类,请验证jar还包含源代码,因为GWT还重新编译传递给客户端的类的Java源代码。

PS:从http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/复制,因为该网站目前不可用。如果您想阅读原始文章,请使用上述网址从谷歌搜索,并从谷歌网络缓存中读取。


7
投票

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


0
投票

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

return myList.subList(fromIndex, toIndex);

0
投票

在我的情况下,我的target文件夹中有一些旧的缓存未正确更新。我不得不重建项目(Maven - > Update Project),然后才有效。


0
投票

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

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

如果你的类实现了Serializable,请检查它是不是最终的......


0
投票

正如Cipous所提到的,在我的情况下,我在Pentaho BI Server的服务器输出中抛出了这个异常。一个简单的硬重载(CTRL + F5)就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.