我为我的应用程序使用了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中。他们然后在运行时可用,似乎都工作正常。
再次感谢您的帮助,如果有人需要有关此解决方法的更多信息,我会很乐意将其发送给他们。
谢谢Jusio。这正是原因。我已经使用一种解决方法更新了我的问题,该解决方法使我可以在客户端和服务器上使用相同的类。 –
@ Farid.O:你可以考虑通过点击左边的复选标记来接受这个答案。哦,欢迎来到StackOverflow。 –