Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 序列化生成的类时出现问题_Gwt_Generator_Rpc - Fatal编程技术网

Gwt 序列化生成的类时出现问题

Gwt 序列化生成的类时出现问题,gwt,generator,rpc,Gwt,Generator,Rpc,我在应用程序中使用GWT2.3。我创建了一个生成器来生成类并向它们添加行为 我的生成器工作正常,可以在客户端调用GWT.create(MyClass.class)。这将返回一个带有正确字段/方法的MyClassImpl对象。当我尝试序列化对象以将其发送回服务器时,出现了序列化异常 调试后,RPC生成器似乎找不到MyClassImpl的类定义 有办法解决这个问题吗?我假设由我自己的生成器生成的类定义将可用于RPC生成器,除非这个定义在我的生成器之前运行 提前感谢您的帮助 法里德 您好,谢谢您的

我在应用程序中使用GWT2.3。我创建了一个生成器来生成类并向它们添加行为

我的生成器工作正常,可以在客户端调用GWT.create(MyClass.class)。这将返回一个带有正确字段/方法的MyClassImpl对象。当我尝试序列化对象以将其发送回服务器时,出现了序列化异常

调试后,RPC生成器似乎找不到MyClassImpl的类定义

有办法解决这个问题吗?我假设由我自己的生成器生成的类定义将可用于RPC生成器,除非这个定义在我的生成器之前运行

提前感谢您的帮助

法里德



您好,谢谢您的快速回答

我生成的类如下所示: -它有一个公共的无参数构造函数 -它实现了Serializable(当然我尝试了Serializable和IsSerializable的所有组合) -是在共享包中生成的(由我调用GWT.create()时的生成器生成) -它的所有属性都是“简单”(原语或字符串)

它看起来像这样(其中TestClass是生成器的标记接口):

我可以在客户端上调用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中。然后,它们在运行时可用,并且似乎一切正常


再次感谢您的帮助,如果有人需要有关此解决方案的更多信息,我将很乐意将其发送给他们。

确保生成器使生成的类可序列化(即实现可序列化接口)。

我相信问题是,生成的类应该同时存在于客户端和服务器上。这就是为什么会出现这个错误。据我所知,生成器在服务器端不工作。也许有办法让它们发挥作用,但我不知道。可能的解决方案-使用-gen选项启动编译器,将生成的类保存到磁盘,将它们编译到*.class并复制到服务器类路径。或者不要使用GWT-RPC=)

尽管在某个地方它读到可以使用Serializable和IsSerializable,但不久前我遇到了一个问题,当我使用GWT的IsSerializable时,这个问题就消失了。不确定在这种情况下这是否重要。您还需要确保,您有一个公共零参数构造函数,或者根本没有构造函数。再见,谢谢你,朱西奥。这正是原因。我用一个解决方案更新了我的问题,让我在客户端和服务器上都使用相同的类。@法里德。O:你可以考虑通过点击左边的复选标记来接受这个答案。哦,欢迎来到StackOverflow。
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)