2011-09-20 35 views
0

我爲我的應用程序使用了GWT 2.3。我創建了一個生成器來生成類並向它們添加行爲。序列化生成類的問題

我的生成器工作正常,我可以在客戶端上調用GWT.create(MyClass.class)。這確實會返回帶有正確字段/方法的MyClassImpl對象。當我嘗試序列化對象以將其發送回服務器時,我有一個SerializationException。

調試後,似乎RPC生成器找不到MyClassImpl的類定義。

有沒有辦法解決這個問題?我認爲由我自己的生成器生成的類定義將可用於RPC生成器,除非這個生成器在我的生成器之前運行?

非常感謝您的幫助。

法裏德



您好,感謝您對快速的解答,

我生成的類如下: - 它有一個公共無參數的構造 - 它實現Serializable(並確保我嘗試了Serializable和IsSerializable的所有組合) - 當我在共享包中調用GWT.create()時,由我的生成器生成) - 它的所有屬性butes是「簡單」(原始或字符串)

它看起來像這樣(其中的TestClass是發電機我的標記接口):在

package com.test.shared; 

import com.test.shared.TestClass; 

public class TestClass_Impl implements TestClass, Serializable { 
    private String testString = "TestString"; 

    public TestClass_Impl() {} 

    public String getTestString() { 
    return testString; 
    } 
} 

我可以調用GWT.create(TestClass.class)客戶。我得到TestClass_Impl的實例,但只要我嘗試通過GWT RPC調用通過網絡發送到格蘭服務器我得到一個異常:

com.test.server.TestServiceServlet-29927840: An IncompatibleRemoteServiceException was thrown while processing this call. 
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl 
    at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:315) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
.... 
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:573) 
    at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119) 
... 
Caused by: java.lang.ClassNotFoundException: com.test.shared.TestClass_Impl 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:366) 
    at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:337) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:543) 

它看起來像GWT RPC找不到在類TestClass_Impl服務器當它試圖實例化它。

有什麼想法? 謝謝,

法裏德



謝謝Jusio。這正是發生了什麼事情。 GWT似乎只是爲了將其交叉編譯爲JavaScript而生成java源代碼,然後放棄生成的java文件。有一個編譯器選項可以將生成的java代碼保存在特定的文件夾中,但生成的.java文件不會與構建一起編譯。

儘管非常複雜和笨拙,但可以更改構建過程以獲取由我的生成器生成的源文件,並將它們包含在構建路徑中,以便它們可以在運行時進行編譯和使用。

我改爲創建一個單獨的類來生成我的java源代碼。該類由生成器用於生成由GWT交叉編譯的Java源代碼。然後我的應用程序使用同一個類動態生成並將這些Java類加載到VM中。他們然後在運行時可用,似乎都工作正常。

再次感謝您的幫助,如果有人需要有關此解決方法的更多信息,我會很樂意將其發送給他們。

回答

2

我相信問題是,生成的類應該存在於客戶端和服務器上。這就是爲什麼你會得到這個錯誤。據我所知,生成器在服務器端不起作用。可能有辦法讓他們工作,但我不知道。可能的解決方案 - 使用-gen選項啓動編譯器,將生成的類保存到磁盤,將它們編譯爲* .class並複製到服務器類路徑。或者不要使用GWT-RPC =)

+0

謝謝Jusio。這正是原因。我已經使用一種解決方法更新了我的問題,該解決方法使我可以在客戶端和服務器上使用相同的類。 –

+1

@ Farid.O:你可以考慮通過點擊左邊的複選標記來接受這個答案。哦,歡迎來到StackOverflow。 –

0

確保您的生成器生成類IsSerializable(即實現了IsSerializable接口)。

+0

儘管在某處它讀取的是Serializable和IsSerializable都可以使用,但是前段時間我遇到了一個問題,當我使用GWT的IsSerializable時,問題就消失了。不知道在這種情況下這是否重要。 –

+0

你還需要確定,你有一個公共的零參數構造函數或沒有構造函數。請參閱[可序列化用戶定義類](http://code.google.com/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideSerializableTypes) – pistolPanties