【问题标题】:GWT RequestFactory: Send changes twiceGWT RequestFactory:发送更改两次
【发布时间】:2014-02-13 15:11:22
【问题描述】:

我需要你对 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 作为更新方法的第二个参数发送。但这太可惜了,因为不仅增量会被发送到服务器(这是 requestFactory 的一大特色)。

那么,在将代理分配给另一个请求时,让请求 3 知道已经对代理进行的更改的最佳和最常见做法是什么。

【问题讨论】:

    标签: gwt requestfactory requestcontext


    【解决方案1】:

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

    request2.createPreview(editableInvoice).fire();

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

    也可以append多个请求

    编辑

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

    request.update(editableInvoice);
    

    request3.update(editableInvoice);
    

    【讨论】:

    • 抱歉,我的代码示例不完整。当然,我在我的代码中调用了 fire 方法。第二个请求不取决于第一个请求的结果。而且我不确定 append 方法在这种情况下是否对我有帮助,因为有了它,我只是一次发送多个请求,我没有想到什么。
    • 你是对的。在我的代码示例中再次出现错误。当然我使用相同的请求,但我的问题仍然存在。我无法将相同的增量发送到服务器两次。
    • @user1215985 如果DAO中的方法仍然没有被调用,检查DAO或Service类是否已经正确映射到DAOLocator中(如果有的话)
    【解决方案2】:

    不错!我找到了解决我的问题的方法。

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

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

    editableInvoice = request3.edit(editableInvoice);
    

    现在是症结所在: 我可以设置一个proxy的原始代理,用来考虑是否改变了,改变了什么。这是通过使用 AutoBean 并像这样设置 PARENT_OBJECT 标记来完成的:

    AutoBean<InvoiceEntityProxy> editableInvoiceBean = AutoBeanUtils.getAutoBean(editableInvoice);
    AutoBean<InvoiceEntityProxy> originalInvoiceBean = AutoBeanUtils.getAutoBean(originalInvoice);
    
    editableInvoiceBean.setTag(Constants.PARENT_OBJECT, originalInvoiceBean);
    

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

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

    【讨论】:

    • 不客气 :),您还应该标记 (+1) 帮助答案,以便帮助的人可以在 stackOverflow 中获得“良好排名”,这对他们都有好处“作为声誉” 并且对于那些将它们“作为可靠性指标”阅读的人。在游戏中收集积分在这里收集积分有点让人上瘾:p 最好的问候
    • 呵呵,我想为你的帖子投票,但我还没有足够的声望。我会尽快:-)
    【解决方案3】:

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

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

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

    【讨论】:

    • AutoBeans 正是我所需要的(见我的回答)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多