軟硬度: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);
什麼是您的服務類和/或requestEservices對象的代碼。被引用的方式具有某種東西的味道。至少,你違反了德米特法則,但可能你甚至偷偷在裏面使用靜態方法,如果你使用的是Robotlegs,那麼沒有理由永遠不要這樣做。 – 2011-12-23 19:11:54
嗨@AmyBlankenship,感謝您花時間閱讀和回覆。我在原始帖子的末尾添加了我的服務類中的代碼。 THX提前 – WWWillems 2011-12-29 15:57:03
您可以添加代碼中的結果和錯誤方法添加?在大多數情況下(不涉及LCDS),結果和錯誤處理程序只有一個參數,事件和異步標記是該事件的一個屬性。由於我之前沒有使用過液晶顯示器,所以我需要明白你正在做什麼來弄清楚發生了什麼。 – 2011-12-31 01:50:43