GWT 2.3 升级后的 RPC 错误

Posted

技术标签:

【中文标题】GWT 2.3 升级后的 RPC 错误【英文标题】:RPC Error after GWT 2.3 upgrade 【发布时间】:2011-05-06 16:17:54 【问题描述】:

升级到 GWT 2.3 后,我的一些 RPC 服务不再工作,并且 以“无法反序列化响应”失败。似乎 发生在返回使用 Date 的对象的服务上 使用 @Temporal(TemporalType.TIMESTAMP) 注释的对象。一世 使用 Gilead 1.3.2 和 Hibernate 3.6,我对 GWT 2.2 没有任何问题。 知道会发生什么,或者如何开始调试?

这是堆栈跟踪:

com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: The response could not be deserialized
  at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:221)
  at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java: 287)
  at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
  at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp l.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597) 
  at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
  at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
  at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:167)
  at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:326)
  at com.google.gwt.dev.shell.BrowserChannelServer.invokejavascript(BrowserChannelServer.java:207)
  at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:132)
  at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
  at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
  at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
  at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
  at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
  at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:214)
  at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
  at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
  at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:167)
  at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:281)
  at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:531)
  at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
  at java.lang.Thread.run(Thread.java:680)
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.sql.Timestamp/1769758459
Caused by: com.google.gwt.user.client.rpc.SerializationException: java.sql.Timestamp/1769758459
  at com.google.gwt.user.client.rpc.impl.SerializerBase.getTypeHandler(SerializerBase.java:153)
  at com.google.gwt.user.client.rpc.impl.SerializerBase.instantiate(SerializerBase.java:114)
  at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:111)
  at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
  at com.lensoo.shared.entity.Course_FieldSerializer.deserialize(Course_FieldSerializer.java:320)
  at com.lensoo.shared.entity.Course_FieldSerializer.deserial(Course_FieldSerializer.java:405)
  at com.google.gwt.user.client.rpc.impl.SerializerBase.deserialize(SerializerBase.java:95)
  at com.google.gwt.user.client.rpc.impl.ClientSerializationStreamReader.deserialize(ClientSerializationStreamReader.java:113)
  at com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamReader.readObject(AbstractSerializationStreamReader.java:119)
  at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter$ResponseReader$8.read(RequestCallbackAdapter.java:106) 
  at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:214)
  ... 26 more 
  ... 26 more

【问题讨论】:

服务端是否也升级到了GWT 2.3?是否有来自服务器的堆栈跟踪? 可能是您使用的对象没有实现接口可序列化,这就是我的想法。 这个问题在最近的 GWT 版本中修复了吗? (我正在尝试升级到 2.5.0-rc1)或者我们是否需要应用修复程序? (吉利德 1.3.2) 【参考方案1】:

我有非常相似的问题 - Gilead 1.3.1,Hibernate。 Exception 也抱怨 Timestamp 字段。

这是我在 Gilead 网站上找到的:

“Gilead 附带的 Timestamp_FieldSerializer 与 GWT 2.2 或 2.3 中明显引入的时间戳冲突”

http://sourceforge.net/tracker/index.php?func=detail&aid=3285026&group_id=239931&atid=1111398

“详细信息”部分的结尾建议了简单的解决方法,但是,我还没有尝试过。

【讨论】:

感谢您的帮助。出于好奇,请从 gilead4gwt.jar 中删除包 com.google.gwt.user.client.rpc.core.java.sql【参考方案2】:

如果您不想接触 JAR - 当您使用 Gilead 1.3.2 作为 Maven 依赖项时,我今天找到了更好的解决方案。

冲突的 Gilead 序列化程序必须被 GWT 2.3 中的这些隐藏,但由于两个 JAR 处于同一级别,并且在 gwt.xml 中定位 inherit 无济于事,因此必须在您的项目结构中重新实现这些。 “新”序列化程序将在服务器和已编译客户端上优先。最后,您可以使用 GWT 2.3 和 Gilead 1.3.2。

分步:

    在您的项目中创建包com.google.gwt.user.client.rpc.core.java.sql。 使用 Eclipse 打开gwt-servlet-2.3.jar 并找到上面包含三个文件Date_CustomFieldSerializer.classTime_CustomFieldSerializer.classTimestamp_CustomFieldSerializer.class 的包。如果 Maven 下载了它,您应该会看到源代码。 在您的项目中重新创建这些源文件。

我想 Gilead 团队应该在下一个版本中删除序列化程序,然后你也将它们从你的项目中删除。

【讨论】:

【参考方案3】:

您只需在 [project_path]/war/WEB-INF/lib 上搜索库 json.jar 并将其添加到构建路径(我使用的是 Eclipse)。

【讨论】:

【参考方案4】:

这很简单。您只需从gilead4gwt-1.3.2.1839.jar 中删除com.google.* 包。

事实上它确实解决了这个问题。

【讨论】:

以上是关于GWT 2.3 升级后的 RPC 错误的主要内容,如果未能解决你的问题,请参考以下文章

GWT RPC 上的错误 404

GWT-RPC 错误 - 子类型不可实例化

检索 ArrayList 时出现 GWT-RPC 无法解释的 500 状态错误

gwt rpc 中的 http 错误代码

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404

gwt rpc 调用的零星 502 错误