GWT - RPC 序列化异常 [英] GWT - RPC SerializationException

查看:30
本文介绍了GWT - RPC 序列化异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经有一段时间没有做 GWT 了,我需要快速完成一些小的事情.我进行了设置,现在我有了一个我需要的 RPC,但它失败了.

It's been a while since I've been doing GWT and I needed something small done quickly. I set things up and now I have a RPC I need, but it fails.

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

The RPC is supposed to give me a ArrayList, and Vacancy is located in #projectname#.client.model. The call is made in #projectname#.client.model.
The interfaces for my Services are in #project#name.client.Service.
Finally, the calls of course go to #projectname#.server.
Vacancy implements IsSerializable. The Exception I get from running my RPC is the following:

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 如下:

The RPC I make is the following:

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 所需的一切工作,并且将 Vacancy 的 ArrayList 作为 RPC 的返回类型算作将 Vacancy 作为返回类型.对吗?我做错了什么?

I thought I had done all I needed to make Vacancy Serializable, and an ArrayList of Vacancy as returntype for the RPC counts as having Vacancy as return type.. right? What am I doing wrong?

提前致谢!

推荐答案

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

This is normally caused by using a non-serializable class, which can occur if your class does not implement com.google.gwt.user.client.rpc.IsSerializable or if you have forgotten to add an empty constructor.

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

To pass a bean you have to fulfill the following requirements (from GWT site):

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

即使您满足这些要求,GWT 编译器可能会说:

Even if you fulfill these requirements may happen that GWT compiler say:

未包含在可以是此 SerializationPolicy 或其 Class 对象无法序列化被加载.出于安全考虑,此类型不会被序列化.:实例 = @

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 = @

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

The problem may have different causes. Here his a complete check list to use for solving the problem:

  1. 验证该类是否具有默认构造函数(不带参数)
  2. 验证该类是否实现了 Serializable 或 IsSerializable 或实现扩展 Serializable 或扩展类的接口实现可序列化
  3. 验证该类是否在 client.* 包或 ...
  4. 验证,如果类不在client.*包中,则编译在您的 GWT xml 模块定义.默认情况下存在.如果您的课程在另一个包中,则必须添加它源.例如,如果您的课程在 domain.* 下,您应该将其添加到 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. 如果您包含来自另一个发布为的 GWT 项目的类一个 jar 验证该 jar 还包含源代码,因为 GWT还要为传递给客户端的类重新编译 Java 源代码.

PS:复制自 http://isolaso​​ftware.it/2011/03/22/gwt-serialization-policy-error/ 因为该站点当前不可用.如果您想阅读原始文章,请使用上述 URL 从 google 搜索它并从 google web 缓存中读取.

PS:copied from http://isolasoftware.it/2011/03/22/gwt-serialization-policy-error/ because the site is unavailable currently. If you want to read the original article search it from google using the above URL and read it from google web cache.

这篇关于GWT - RPC 序列化异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆