【发布时间】:2011-11-21 02:03:29
【问题描述】:
我正在为我的应用程序使用 GWT 2.3。我创建了一个生成器来生成类并向它们添加行为。
我的生成器工作正常,我可以在客户端调用 GWT.create(MyClass.class)。这确实会返回具有正确字段/方法的 MyClassImpl 对象。当我尝试序列化对象以将其发送回服务器时,我遇到了 SerializationException。
调试后,RPC 生成器似乎找不到 MyClassImpl 的类定义。
有没有办法解决这个问题?我假设我自己的生成器生成的类定义将可用于 RPC 生成器,除非这个类定义在我的生成器之前运行?
提前感谢您的帮助。
法里德
您好,感谢您的快速回答,
我生成的类如下: - 它有一个公共的无参数构造函数 - 它实现了 Serializable (并且确保我尝试了 Serializable 和 IsSerializable 的所有组合) - 在共享包中生成(当我调用 GWT.create() 时由我的生成器生成) - 它的所有属性都是“简单的”(原始或字符串)
看起来像这样(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 时无法在服务器上找到它。
有什么想法吗? 谢谢,
远方
谢谢你。这正是发生的事情。 GWT 似乎生成 java 源代码只是为了将其交叉编译成 javascript,然后丢弃生成的 java 文件。有一个编译器选项可将生成的 java 代码保存在特定文件夹中,但生成的 .java 文件不会与构建一起编译。
虽然非常复杂和笨拙,但可以更改构建过程以获取由我的生成器生成的源文件并将它们包含在构建路径中,以便可以在运行时对其进行编译和使用。
我创建了一个单独的类来生成我的 java 源代码。生成器使用这个类来生成要被 GWT 交叉编译的 java 源代码。然后,我的应用程序使用同一个类来动态生成这些 java 类并将其加载到 VM 中。然后它们在运行时可用,并且一切似乎都工作正常。
再次感谢您的帮助,如果有人需要有关此解决方法的更多信息,我很乐意将其发送给他们。
【问题讨论】: