2012-03-02 98 views
13

自从我一直在做GWT以来,我一直需要做一些很快完成的小事情。我设置了一些东西,现在我有一个我需要的RPC,但它失败了。GWT - RPC序列化异常

RPC应该给我一个ArrayList,空缺位于#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 = [email protected] 
    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(); 
    } 
} 

我想我已经做了所有我需要做出空缺序列化,和一个ArrayList的空缺作为RPC的返回类型算作空闲为返回类型..对吗?我究竟做错了什么?

在此先感谢!

+0

你确定你在'Vacancy'类中实现了'com.google.gwt.user.client.rpc.IsSerializable'吗? – 2012-03-02 14:09:04

+1

'import com.google.gwt.user.client.rpc.IsSerializable;' 'public class空缺实现IsSerializable {' 绝对。 – 2012-03-02 14:10:42

回答

30

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

传给你必须满足以下要求(从GWT网站)一个bean:

  1. 它实现了无论是Java的序列化或GWT IsSerializable 接口,无论是直接,或者因为它从超 得出结论说确实。
  2. 其非最终的,非瞬态实例字段本身 序列化
  3. 它与任何访问 修改默认的(零参数)构造函数(如私人美孚(){}将工作)

即使你满足这些要求可能会发生GWT编译器说:

不包括在该组的类型可以是 本SerializationPolicy或序列化的类对象无法 被加载。为了安全起见,此类型不会被序列化。: instance = @

问题可能有不同的原因。这里使用的解决问题了一个完整的检查表:

  1. 验证类有一个默认的构造函数(不带参数)
  2. 验证类实现Serializable或IsSerializable或 实现扩展序列化接口或扩展类 ,实现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. 如果是包括释放 另一个GWT项目类中的罐子验证罐子还包含了源代码,因为GWT 重新编译也传递到客户端的类Java源代码。

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

+1

我已经包含了下面的构造函数:'public Vacancy(){}'。我从服务器检索到的对象使用参数化的构造函数,但我认为这不应该有任何区别。(?) – 2012-03-02 14:16:54

+0

您可以共享您的实现RemoteService接口和传输对象的类空缺 – 2012-03-02 14:24:20

+0

服务器端实现,目前与演示数据: http://pastebin.com/f88rMZEJ 服务: http://pastebin.com/Yt8piq1m 异步: http://pastebin.com/Lbuav4yr – 2012-03-08 01:53:17

6

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

0

我也得到这个错误,当我使用的子表:

return myList.subList(fromIndex, toIndex); 
+0

如果测试'return myList',它工作吗? 'sublist'不应该改变返回的类型。 – 2018-02-26 15:02:47

+0

myList没有改变,但我想获得子列表,所以我用for循环(java 7) – paka 2018-03-01 10:11:43

0

在我的情况下,有一些旧的缓存在我target文件夹没有正确更新。我不得不重建项目(Maven - >更新项目),然后工作。