我正在使用RobotLegs, LiveCycle DS开发Flex应用程序;Java。我试图实现一个更新功能,使用lcd,但我遇到了一些奇怪的行为:
这是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() {
}
}
第一次执行Actionscript代码时,一切正常。AsyncToken由services.requestService.commit()
函数很好地返回,resultHandler按预期执行,并且我的对象在GUI中更新。
然而,第二次执行这段代码时,我的services.requestService.commit()
函数返回一个空值,并且我的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?
提前感谢!
按照要求,我从services类中添加了(剥离的)代码。如您所见,没有什么特别的:
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();
}
}
}
这是我的结果- &添加了错误处理程序:
var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail));
var responder:AsyncResponder = new AsyncResponder(resultHandler, faultHandler, token);
if ( token ) token.addResponder(responder);
当您没有要提交的更改时,aysnctoken返回null。
WWW,这不是一个真正的答案,但我需要更多的空间比评论会给我。然而,我并没有看到你所有的代码是如何连接得足够好,从而给你一个好的答案。
一般来说,结果和故障签名不应该看起来像您所描述的"正确"签名。AsyncToken期待一个IResponder,它的fault和result方法有一个单个参数,该参数是一个Object。通常,将使用fault或result事件(视情况而定)调用该函数。
现在我要进入的领域,对我来说,是纯粹的理论。在我看来,DataService类可能只创建一个AsyncToken,因为连接保持打开状态。如果是这种情况,则错误的方法签名可能会损坏AsyncToken,使其无法返回供方法使用。在你粘贴的代码中,我没有看到任何东西看起来像是以自定义的方式调用你的result和fault方法。
我强烈怀疑问题出在Java代码上。AFAIK, AsyncToken被创建并设置为在调用之前调用响应器中的函数(至少这是它与HTTPService或amf一起工作的方式)。我希望有一些错误被"有用地"抑制了,所以您可能会从分步执行代码中受益。
我建议您后退一步,更仔细地研究一下Robotlegs所隐含的MVCS体系结构的"S"部分,并创建一个单独的服务类来管理整个东西,并且仅仅从命令中启动进程,而不是试图在命令和服务之间来回传递控制。作为附带的好处,当您不需要连接到实际数据时(例如进行设计工作时),您可以将实际服务的实例替换为测试服务。