2

我们正在使用 GWT Atmosphere 将字符串从服务器发送到客户端,并且效果很好。

但是,我们希望将整个实体从服务器发送到客户端,由 GWT RequestFactory 序列化。无需客户要求!

因此,我尝试使用SimpleRequestProcessor#createOobMessage(domainObject)该有效负载并将其发送给客户端。计算有效载荷有效。

然后我会使用解码该消息并从调用列表中AutoBeanCodex#decode读取domainObject正确的- 但是当我这样做时,它需要某种设置才能继续(大约第 260 行:)EntityProxyResponseMessageserverIdAbstractRequestFactory#getIdassert serverId != null : "serverId"

关于如何在没有客户端发送请求的情况下解码代理有效负载的任何建议?

更新

这个问题的用例是类似聊天的交流。客户端不会向服务器请求消息,而是会收到新消息的通知。我们希望在通知有效负载中包含消息和有关谁发送消息的信息。由于无论如何我们在项目中都使用了 RequestFactory,我们希望利用已设置所有代理连接的优势,现在只需将相关的对象图推送到客户端。

4

1 回答 1

1

您为什么要尝试序列化 RF 消息并将它们作为实体发送?RequestFactory 不仅仅是一种通过线路发送数据的方式——它至少有三种不同类型的消息可以从客户端发送到服务器:创建实例、调用设置器和调用服务方法。根据服务器上发生的情况,不仅可以向客户端返回数据,还可以向客户端返回有关进行了哪些更改以及这些设置者是否进行了根据 JSR303 规则无效的更改的消息。

您是否正在尝试一种更简单的接口方式来描述、发送和接收实体?或者您是否真的想要客户端和服务器上的 RF 接线,以便您可以批量请求、引用 EntityProxyId 实例并让客户端只发送差异?

如果您只想要更简单的对象声明,请尝试只使用AutoBeans 和AutoBeadCodex您已经看过的 - 您将能够轻松地在客户端和服务器上创建和编组实例,并且您可以将它们作为字符串传递给大气的传输。

如果你真的想要 RequestFactory,但运行在 AJAX 以外的东西上,还有其他选择。与其通过 Atmosphere 发送/接收字符串(我认为它旨在为 RPC 调用提供推送支持),不如考虑使用底层推送层在 RequestFactory 中实现新的请求传输。

com.google.web.bindery.requestfactory.shared.RequestTransport可以实现(请参阅com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport默认 AJAX 版本)以使用您想要的任何通信机制 - 并构建服务器,看看com.google.web.bindery.requestfactory.server.RequestFactoryServlet实际上必须做什么才能通过 Locator、ServiceLocators 等推送消息。

如果你真的想使用 Atmosphere 和 RF,那么考虑构建一个RequestTransport包装简单的 Atmosphere 接口以使用字符串调用服务器 - cometd/websocket 调用已经为你处理好了,你只需要将字符串消息转换为调用(再次查看 RequestFactoryServlet 是如何做到的)。

于 2012-01-10T01:12:30.817 回答