我们正在使用GWT Atmosphere从服务器向客户端发送字符串,它运行良好。
但是,我们希望将整个实体从服务器发送到客户端,由GWT RequestFactory序列化。无需客户的要求!
所以我尝试使用SimpleRequestProcessor#createOobMessage(domainObject)
并将该有效负载发送到客户端。计算有效载荷有效。
然后我会使用AutoBeanCodex#decode
解码该消息,并从domainObject
的调用列表中将EntityProxy
读作正确的ResponseMessage
- 但是当我这样做时,它需要某种serverId
设置为AbstractRequestFactory#getId
(第260行:assert serverId != null : "serverId"
)
关于如何在没有客户端发送请求的情况下解码代理有效负载的任何建议?
此问题的用例是聊天式通信。客户端不会从服务器请求消息,而是会收到新消息的通知。我们希望在通知有效负载中包含有关谁发送消息的消息和信息。由于我们在项目中使用RequestFactory,我们希望利用设置所有代理连接的布线,现在只需将相关的对象图推送到客户端。
答案 0 :(得分:1)
为什么要尝试序列化RF消息并将其作为实体发送? RequestFactory不仅仅是通过网络发送数据的方式 - 它至少有三种不同类型的消息可以从客户端发送到服务器:创建实例,调用setter和调用服务方法。根据服务器上发生的情况,不仅可以将数据返回给客户端,还可以返回有关所做更改的消息以及这些setter是否根据JSR303规则进行了无效更改。
您是否正在尝试使用更简单的界面方式来描述,发送和接收实体?或者你真的想要客户端和服务器上的射频接线,以便你可以批量请求,参考EntityProxyId实例并让客户端只发送差异?
如果您只想要更简单的对象声明,请尝试使用AutoBean
和您已经查看的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是如何做到的)。