2012-03-02 138 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 - >更新項目),然後工作。