我有一个GWT应用程序,它在开发模式下与GWT的嵌入式jetty服务器完美地运行。
但是,我需要转而使用外部jetty服务器(由于各种原因)。我遵循了GWT文档Compile&准确地调试外部服务器设置。
我的应用程序正在运行,但在加载的2/3时间里,我收到了类似于以下的序列化异常(在服务器端):
com.google.gwt.user.client.rpc.SerializationException:类型"my.package.impl.ContentTypeImpl"不可分配给"com.google.gvt.user.cclient.rpc.IsSerializable",并且没有自定义字段序列化程序。出于安全目的,不会序列化此类型。:实例=my.package.impl.ContentTypeImpl@5e5edf72
我确信这个特定的类是可序列化的,并且我已经确保编译了我的应用程序并将静态资产移动到我的外部服务器war目录中。就像我说的,它大约每三次刷新浏览器就会工作一次。
有什么建议吗?
谢谢!
来自:http://www.gwtproject.org/doc/latest/tutorial/RPC.html#serialize
如果类满足以下三个要求,则它是可序列化的:
- 它实现
Java Serializable或GWTIsSerializable接口,无论是直接的,还是因为它派生自超类确实如此<-- - 它的非最终、非瞬态实例字段本身就是可序列化,以及
- 它有一个默认的(零参数)构造函数,可以访问修饰符(例如private Foo(){}将起作用
我的猜测是,您在外部服务器中使用了一个单独的war目录,已经将所有静态内容(包括*.gwt.rpc文件)复制到该war目录中,然后更改了您在rpc调用中传递的可序列化模型。每当这些模型发生更改时,生成的.gwt.rpc文件就会发生更改。您的服务器将使用序列化策略的一种变体,而客户端java调试将使用不同的策略。
我能想到两种选择:
-
请确保将.gwt.rpc文件复制到服务器war目录中。您可以创建一个自定义蚂蚁任务来完成此任务。
-
将外部web服务器配置为指向用于内部GWT调试的同一war目录。这样,当GWT生成更改时,它们会自动地放在正确的位置。
选项#2是我在处理需要外部服务器的大型复杂系统时使用的选项。