2011-09-20 36 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