2011-07-27 74 views
0

我在我的GWT應用程序的客戶端定義了MyObject,該應用程序實現了IsSerializable,其中MyObject{String, Timestamp, Timestamp, String}GWT序列化MyObject java.sql.Timestamp

如果做一個簡單的RPC(其中AsyncCallback<ArrayList<MyObject>>),我收到以下錯誤:

com.google.gwt.user.client.rpc.StatusCodeException: 500 The call failed on the server; see server log for details 
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:209) 
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287) 
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:167) 
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326) 
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:207) 
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:132) 
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561) 
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269) 
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91) 
at com.google.gwt.core.client.impl.Impl.apply(Impl.java) 
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214) 
at sun.reflect.GeneratedMethodAccessor16.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103) 
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) 
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:167) 
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281) 
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531) 
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352) 
at java.lang.Thread.run(Unknown Source) 

我只AsyncCallback<MyObject>返回一個MyObject的(而不是一個ArrayList),這也造成了上述嘗試錯誤。

最後,我刪除了Timestamp屬性,這樣MyObject{String, String},它的工作,導致我認爲序列化java.sql.Timestamp存在問題。任何人都可以對此發表評論,並告訴我如何最好地繼續下去?

我檢查了服務器日誌,發現沒有什麼不尋常的。

編輯1: 我測試過MyObject{Timestamp},也失敗了。

解決方案到目前爲止: 相當哈克,移動MyObject到共享文件夾,並宣佈時間戳作爲transient,然後將它們轉換爲多頭,這樣我可以在客戶端從他們的創建時間戳對象。醜陋的,我知道,但它有效。

+0

您是否將DTO(Data Transer對象)放入共享文件夾? – helpermethod

+0

我獨立地嘗試了你的兩個建議,但他們都沒有工作。我最終一起嘗試(共享文件夾+長轉換),將我的時間戳設置爲瞬態。不是我期望的優雅解決方案,但它現在可行。 – Vertical22

回答

0

我很確定序列化一個java.sql.Timestamp是可能的GWT。如有疑問,閱讀了關於GWT的序列化類型:

http://code.google.com/webtoolkit/doc/latest/DevGuideServerCommunication.html#DevGuideSerializableTypes

所以我假設你的電話在你的方法失敗,在服務器端,而不是序列化過程中。您是否嘗試附加調試器來查看服務器端方法中發生了什麼?

+0

我讀過GWT可序列化類型,這就是爲什麼我很困惑爲什麼這不起作用(訴諸於絕望的SO問題:P)。起初它失敗了,因爲它無法在服務器端序列化,我想也許是因爲我使用了字符串和時間戳,但即使在編輯1之後,它仍然無法在服務器端序列化。我確實附加了一個調試器,而且我仍然遇到了與此問題相同的錯誤。 – Vertical22

1

我有一個類似的錯誤,所以我解決了在這種情況下添加一個空的構造器中的MyObject類

public MyObject(){}

我希望這可以幫助別人。

再見。