问题序列化生成的类

时间:2011-09-20 13:05:14

标签: gwt generator rpc

我正在为我的应用程序使用GWT 2.3。我创建了一个生成器来生成类并为它们添加行为。

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

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

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

提前感谢您的帮助。

法里德



您好,谢谢您的快速回答,

我生成的课程如下: - 它有一个public no arg构造函数 - 它实现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。

有什么想法吗? 谢谢,

法里德



谢谢Jusio。这正是发生的事情。 GWT似乎只是为了将其交叉编译为javascript而生成java源,然后丢弃生成的java文件。有一个编译器选项可以将生成的java代码保存在特定文件夹中,但生成的.java文件不会使用构建进行编译。

虽然非常复杂和笨拙,但可以更改构建过程以获取由我的生成器生成的源文件并将它们包含在构建路径中,以便它们可以在运行时编译和使用。

我改为创建了一个单独的类来生成我的java源代码。生成器使用此类生成由GWT交叉编译的java源。然后,我的应用程序使用相同的类来动态生成这些Java类并将其加载到VM中。然后它们在运行时可用,并且所有工作似乎都正常。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

确保您的生成器生成生成的类IsSerializable(即,实现IsSerializable接口)。