GWT RequestFactory:发送两次更改

时间:2014-02-13 15:11:23

标签: gwt requestfactory requestcontext

我需要你对gwt requestfactory的帮助

考虑以下情况:
我从服务器获得一个现有的实体(比方说一张发票):

InvoiceEntityProxy invoice = request1.getInvoice();

我想进行一些更改,因此我使用新请求对其进行编辑:

InvoiceEntityProxy editableInvoice = request2.edit(invoice);
//make some changes to editableInvoice

现在我将使用第二个请求所做的更改发送到服务器,以创建预览:

request2.createPreview(editableInvoice);

发送请求时,发票代理被冻结,我通过将代理分配给新请求来重新启用编辑:

editableInvoice = request3.edit(editableInvoice);

如果一切正常,我想更新代理并使用最新的请求将其发送到服务器:

request3.update(editableInvoice);

但是更改永远不会到达服务器,因为最新请求(request3)对分配给request2的代理所做的更改一无所知。

我考虑过以下解决方案:

  1. 我可以重做最新代理的更改。但为此,我要迭代所有属性并再次设置它们(不是非常友好的解决方案,因为每次我向代理添加一些属性时我都要调整方法)
  2. 另一种方法是将没有id的proyx发送到服务器,并将id作为update-method的第二个参数发送。但这将是一种耻辱,因为不仅将增量发送到服务器(这是requestFactory的一个重要特性)。
  3. 那么,当将request3分配给另一个请求时,让request3知道已经对代理进行的更改的最佳和最常见的做法是什么。

3 个答案:

答案 0 :(得分:1)

您只是忘记致电fire()。实施例

request2.createPreview(editableInvoice).fire();

请记住,如果以下请求取决于前一个请求的结果,则应将代码放在OnSuccess方法中,因为请求是异步的

还可以append多个请求

修改

对编辑和消防操作使用相同的请求很重要。所以替换这一行

request.update(editableInvoice);

request3.update(editableInvoice);

答案 1 :(得分:1)

尼斯!我找到了解决问题的方法。

我仍然有原始代理的实例,因为上下文的edit()方法总是返回代理的新实例。所以我在发送任何请求之前保存了原始代理。

每次成功请求后,我再次调用编辑方法重新启用编辑代理:

editableInvoice = request3.edit(editableInvoice);

现在关键: 我可以设置代理的原始代理,用于考虑它是否已更改以及更改的内容。这是通过使用AutoBean并像下面这样设置PARENT_OBJECT标签来完成的:

AutoBean<InvoiceEntityProxy> editableInvoiceBean = AutoBeanUtils.getAutoBean(editableInvoice);
AutoBean<InvoiceEntityProxy> originalInvoiceBean = AutoBeanUtils.getAutoBean(originalInvoice);

editableInvoiceBean.setTag(Constants.PARENT_OBJECT, originalInvoiceBean);

在下一个请求中,所有更改的属性都会再次发送到服务器。

感谢您的帮助,感谢您对AutoBean @Zied Hamdi的提示

答案 2 :(得分:0)

在开始更改对象之前,您还可以使用AutoBeans复制对象。您可以保持原始的不变,然后request.edit()它并从“脏”对象应用更改(内省更改)。

您可能需要对如何处理EntityProxies进行一些研究,因为它们是“特殊AutoBeans”:我必须使用特殊的实用程序对象将它们序列化为json(在GWT中可用)。因此,在执行深层复制时可能会有一些特殊处理。

GWT可能存在一个问题,只保留每个EntityProxy的一个版本(我从未检查过它是全局的还是仅在请求的上下文中)