2014-02-13 31 views
0

我需要你的幫助與GWT requestfactoryGWT RequestFactory:發送變化兩次

考慮以下情形:
我得到一個現有實體(比方說,一個發票)從服務器:

InvoiceEntityProxy invoice = request1.getInvoice(); 

我想做出一些改變,所以我有一個新的請求編輯:

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

現在我仙d與第二請求到服務器所做的更改,來創建預覽:

request2.createPreview(editableInvoice); 

當請求被髮送,發票代理被凍結,通過指定代理到一個新的請求,我重新啓用編輯:

editableInvoice = request3.edit(editableInvoice); 

如果一切順利,我想更新代理,並將其發送給服務器,採用最新的請求:

request3.update(editableInvoice); 

但變化的服務器上永遠不會到來,因爲日e最近的請求(request3)不知道對分配給request2的代理所做的更改。

我想到了以下解決方案:

  1. 我可以重做最新代理的變化。但是爲此,我必須迭代所有屬性並重新設置它們(不是非常友好的解決方案,因爲每次向代理添加一些屬性時都要調整方法)
  2. 另一種方法是發送沒有id的proyx到服務器並且發送id作爲更新方法的第二個參數。但這是一個恥辱,因爲不僅deltas會被髮送到服務器(這是requestFactory的一個特性)。

那麼什麼是最好的和最常見的做法是讓request3知道已經對代理進行了更改,並將其分配給另一個請求。

回答

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的提示

+0

歡迎您:),您還應該標記(+1)幫助解答,這樣幫助的人可以在堆棧溢出中獲得「良好的排名」,這對他們「作爲聲譽」以及對於那些閱讀它們「作爲可靠性指標」。在遊戲中收集積分以在這裏收集積分有點令人上癮:p 最好的問候 –

+1

呵呵,我想爲你的帖子投票,但我還沒有足夠的聲望。我會盡快:-) – user1215985

1

你只需忘記撥打fire()即可。示例

request2.createPreview(editableInvoice).fire();

請記住,如果滿足下列要求依賴於以前的一個結果,你應該把你的代碼在OnSuccess梅索德因爲請求是異步

它也可能append多個請求

編輯

使用相同的請求進行編輯和消防操作很重要。因此,更換此行

request.update(editableInvoice); 

request3.update(editableInvoice); 
+0

對不起,我的代碼示例不完整。當然,我在我的代碼中調用了fire方法。第二個請求不依賴於第一個請求的結果。而且我不確定,如果append方法在這種情況下可以幫助我,因爲有了它,我只需一次發送多個請求,我心中並沒有什麼。 – user1215985

+0

你是對的。在我的代碼示例中再次出現錯誤。當然我使用相同的請求,但我的問題依然存在。我無法將相同的三角洲發送到服務器兩次。 – user1215985

+0

@ user1215985如果DAO中的方法仍未被調用,請檢查DAO或服務類是否已正確映射到DAOLocator中(如果有的話) – outellou

0

您還可以使用AutoBeans你開始改變之前複製的對象。你可以保持原來的不變,然後request.edit()它並從「髒」對象中應用更改(像更改內容)。

您可能需要做一些關於如何處理EntityProxies的研究,因爲它們是「特殊的AutoBeans」:我不得不使用特殊的實用程序對象將它們序列化爲json(可在GWT中使用)。所以在做深層複製時可能會有一些特殊的處理。

有可能與GWT的問題保持每個EntityProxy只有一個版本(如果它是全球性的我從來沒有檢查或僅在請求的上下文中)

+0

AutoBeans正是我所需要的(請參閱我的答案)。謝謝 – user1215985