2011-12-23 46 views
0



軟硬度:LCDS服務執行時返回空的AsyncToken第二次

我正在開發使用Robotlegs的Flex應用程序,Livecycle DS在&的Java。 我試圖實現更新的功能,使用液晶顯示器,但我遇到了一些奇怪的行爲:

這是一個Robotlegs的execute命令中的ActionScript代碼, 用於執行更新:

var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail)); 
responder = new AsyncResponder(resultHandler, faultHandler, token); 
if (token) token.addResponder(responder); 



model.currentRequestDetail我試圖更新是RequestDetail對象:

[Managed] 
[RemoteClass(alias="be.fgov.mobilit.td.lcds.vo.RequestDetail")] 
public class RequestDetail { 

    public var id:Number; 
    public var request:Request; 
    public var task:Task; 

    /** 
    * Constructor 
    */ 
    public function RequestDetail() { 
    } 
} 

第一次執行腳本代碼時,一切正常。 AsyncToken很好地被​​函數返回, resultHandler按預期執行,並且我的對象在GUI中被更新。
但是,第二次執行此代碼時,我的​​函數返回空值,並且我的resultHandler永遠不會到達。 我懷疑我們甚至沒有到達java彙編程序。



這是我宣佈的DataService:

var requestDetailService:DataService = new DataService("requestDetail"); 
requestDetailService.autoCommit = false; 



無論是resultHandler &的faultHandler具有正確的簽名:

resultHandler(result:Object, token:Object = null) 
faultHandler(result:Object, token:Object = null) 



我們還使用自定義的Java彙編,這是代碼:

package be.fgov.mobilit.td.lcds.assemblers; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import be.fgov.mobilit.td.lcds.vo.RequestDetail; 
import flex.data.ChangeObject; 
import flex.data.assemblers.AbstractAssembler; 

public class RequestAssembler extends AbstractAssembler { 

public RequestAssembler() { 
    // TODO Auto-generated constructor stub 
} 

public RequestDetail getRequest(Map<String, Object> identity) { 
    return ServiceUtility.getLcdsService().getRequestDetail(identity); 
} 

public List<ChangeObject> syncRequest(List<ChangeObject> changes) { 
    Iterator<ChangeObject> iterator = changes.iterator(); 
    ChangeObject co; 
    while (iterator.hasNext()) { 
     co = (ChangeObject) iterator.next(); 
     if (co.isUpdate()) { 
      co = doUpdate(co); 
     } 
    } 
    return changes; 
} 

private ChangeObject doUpdate(ChangeObject co) { 
    RequestDetail requestDetail = (RequestDetail) co.getNewVersion(); 
     co.setNewVersion(ServiceUtility.getLcdsService().updateRequestDetail(requestDetail)); 
    return co; 
} 
} 



這是彙編程序的配置:

<destination id="request"> 
    <properties> 
<source>be.fgov.mobilit.td.lcds.assemblers.RequestAssembler</source> 

     <scope>application</scope> 

     <metadata> 
      <identity property="id" /> 
      <identity property="task" /> 
     </metadata> 

     <server> 
      <get-method> 
       <name>getRequest</name> 
      </get-method> 
      <sync-method> 
       <name>syncRequest</name> 
      </sync-method> 
     </server> 
    </properties> 
</destination> 




長話短說:
有沒有人有線索/經驗,爲什麼我第二次執行services.requestService.commit();函數它返回一個空的Asynctoken?




Thx提前!




根據要求,我添加了從我的服務類的(剝離)代碼。 正如你所看到的,沒有什麼特別事情:

package be.fgov.mobilit.services { 
import mx.data.DataService; 
import mx.messaging.Consumer; 
import mx.messaging.events.MessageEvent; 
import mx.rpc.http.HTTPService; 

public class LiveCycleServices { 

    public var requestService:DataService; 

    public function LiveCycleServices() {   

     requestService = new DataService("request"); 
     requestService.autoCommit = false; 
    } 


    /** 
    * @param MessageEvent The event object that is dispatched by the Flex framework 
    * @return void 
    * 
    * This message captures the server push messages that need to trigger an update 
    * of the task list, since this is specific for every client and cannot be 
    * determined on the server side, coming from LiveCycle. 
    */ 
    private function messageHandler(event:MessageEvent):void { 
     taskListService.refresh();   
    } 
} 
} 



這是我的result- & faulthandlers添加的斥責

var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail)); 
var responder:AsyncResponder = new AsyncResponder(resultHandler, faultHandler, token); 
if (token) token.addResponder(responder); 
+0

什麼是您的服務類和/或requestEservices對象的代碼。被引用的方式具有某種東西的味道。至少,你違反了德米特法則,但可能你甚至偷偷在裏面使用靜態方法,如果你使用的是Robotlegs,那麼沒有理由永遠不要這樣做。 – 2011-12-23 19:11:54

+0

嗨@AmyBlankenship,感謝您花時間閱讀和回覆。我在原始帖子的末尾添加了我的服務類中的代碼。 THX提前 – WWWillems 2011-12-29 15:57:03

+0

您可以添加代碼中的結果和錯誤方法添加?在大多數情況下(不涉及LCDS),結果和錯誤處理程序只有一個參數,事件和異步標記是該事件的一個屬性。由於我之前沒有使用過液晶顯示器,所以我需要明白你正在做什麼來弄清楚發生了什麼。 – 2011-12-31 01:50:43

回答

0

WWW,這ISN」這真的是一個答案,但我需要更多的空間,而不是評論會給我的空間。但是,我沒有看到你的所有代碼如何連接好以便給你一個很好的答案。

通常,結果和故障簽名應該是而不是看起來就像您所描述的「正確」簽名。該標記的AsyncToken期待一個的IResponder,這是誰的過錯,並因此mentods有參數是一個對象。一般來說,這將通過故障或結果事件(如適用)來調用。

現在我進入境內即,對我來說,純粹的理論。在我看來,DataService類可能只創建一個AsyncToken,因爲連接保持打開狀態。如果是這種情況,那麼錯誤的方法簽名可能會損壞AsyncToken,以至於無法返回以供該方法使用。我沒有看到您粘貼的代碼中的任何東西,看起來像以自定義的方式調用您的結果和錯誤方法。

我強烈懷疑,這個問題是在Java代碼中。 AFAIK,AsyncToken被創建並設置爲在調用之前調用響應者中的函數(至少它看起來是如何與HTTPService或amf一起工作的)。我希望有一些錯誤被「有用」抑制,所以你可能會從代碼中獲益。

我建議你稍微退一步,在Robotlegs所隱含的MVCS架構的「S」部分看起來有點困難,並創建一個單獨的服務類來管理整個事情,並且僅僅啓動流程而不是試圖在你的命令和服務之間來回傳遞控制權。作爲一個附帶的好處,當你不需要連接到實際的數據(例如進行設計工作)時,你可以將實際服務的實例換成測試服務。當你沒有更改提交

+0

嗨@AmyBlankenship,根據此鏈接: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/rpc/AsyncResponder.html我的結果 - &錯誤處理程序是正確的。我不知道每個連接或每個請求是否只有一個AsyncToken。我個人不認爲我的AsyncToken被錯誤的方法簽名「損壞」。我想我會嘗試按照你的建議創建一個單獨的服務課程,因爲我沒有想法。 Thx爲你的時間 – WWWillems 2012-01-04 09:59:20

1

的aysnctoken返回null。希望這可以幫助。

相關問題