GWT 通过 RPC 发送类型 OBJECT

Posted

技术标签:

【中文标题】GWT 通过 RPC 发送类型 OBJECT【英文标题】:GWT Sending type OBJECT Via RPC 【发布时间】:2010-12-16 21:48:57 【问题描述】:

我正在尝试这样做

服务接口:

Boolean SaveObjectIntoDatabase(Object Entity);

ServiceAsync:

void SaveObjectIntoDatabase(Object Entity,AsyncCallback <Boolean> Callback);

然后在 serviceimpl 上实现它

没有成功。

是不是我们不能通过GWT RPC发送object类型的变量??

堆栈跟踪:

onModuleLoad() threw an exception

Exception while loading module com.BiddingSystem.client.BiddingSystem. See Development Mode for details.
java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:396) at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:183) at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510) at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352) at java.lang.Thread.run(Thread.java:662) Caused by: java.lang.RuntimeException: Deferred binding failed for 'com.BiddingSystem.client.Service' (did you forget to inherit a required module?) at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:53) at com.google.gwt.core.client.GWT.create(GWT.java:97) at com.BiddingSystem.client.BiddingSystem.onModuleLoad(BiddingSystem.java:63) ... 9 more Caused by: com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) at com.google.gwt.dev.shell.ModuleSpace.rebind(ModuleSpace.java:595) at com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:455) at com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49) ... 11 more 

【问题讨论】:

【参考方案1】:

类 java.lang.Object 不是serializable。

【讨论】:

【参考方案2】:

GWT 需要在编译时知道您将通过 RPC 发送的所有类。它为它们中的每一个生成适当的存根等。

不幸的是,能够笼统地说你正在发送Object 并没有用,因为它会为Object 生成一个存根(实际上它不会,因为它不可序列化,但可以想象它会),但是例如,该存根对于StringDate 是无用的。

有办法解决这个问题。更常见的一种方法是定义一个从未调用过的 RPC API 方法,它只列出您想要发送的所有类型:

public void allTypeIWantToMarshall(Date a, String b, Integer c, Trousers d /* etc */);

但显然这是一个可怕的黑客攻击和维护噩梦。

最好重新设计 API,使其不使用 Object

【讨论】:

【参考方案3】:

使对象类本身实现可序列化接口

【讨论】:

【参考方案4】:

每个类都应该是可序列化的,以便从客户端发送到服务器。对象不可序列化,这就是您无法发送它的原因。

如果你想将它发送到服务器,每个类都应该实现 GWT isSerializable 接口。 java.io.Serializable 和 GWT isSerializable 不一样

【讨论】:

以上是关于GWT 通过 RPC 发送类型 OBJECT的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HttpClient 发送 GWT-RPC 请求?

在 GWT-RPC 中将 ArrayList 作为参数发送

GWT - 当我发送 Map<Object, Object> 时出现 SerializationException

GWT RPC如何发送任何对象

发送请求前的 GWT RPC 客户端序列

Gwt-rpc 仅使用 DAO。摆脱 DTO