首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flex : LCDS服务在第二次执行时返回null Asynctoken

Flex : LCDS服务在第二次执行时返回null Asynctoken
EN

Stack Overflow用户
提问于 2011-12-23 23:20:28
回答 2查看 510关注 0票数 0

我正在使用RobotLegs、LiveCycle DS和Java开发一个Flex应用程序。我正在尝试实现一个更新函数,使用LCDS,但我遇到了一些奇怪的行为:

这是RobotLegs的execute命令中的ActionScript代码,用于执行更新:

代码语言:javascript
复制
 var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail));
 responder = new AsyncResponder(resultHandler, faultHandler, token);
 if ( token ) token.addResponder(responder);

我尝试更新的model.currentRequestDetail是一个RequestDetail对象:

代码语言:javascript
复制
[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代码时,一切正常。services.requestService.commit()函数很好地返回了AsyncToken,resultHandler按预期执行,我的对象在图形用户界面中更新。

然而,第二次执行这段代码时,我的services.requestService.commit()函数返回一个空值,并且我的resultHandler永远不会到达。我怀疑我们甚至还没到java汇编程序的地方。

下面是我声明DataService的方式:

代码语言:javascript
复制
var requestDetailService:DataService = new DataService("requestDetail");
requestDetailService.autoCommit = false;

resultHandler和faultHandler都有正确的签名:

代码语言:javascript
复制
resultHandler(result:Object, token:Object = null)
faultHandler(result:Object, token:Object = null)

我们还使用了一个自定义的java汇编程序,这是代码:

代码语言:javascript
复制
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;
}
}

这是汇编器的配置:

代码语言:javascript
复制
<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();函数会返回空的异步令牌?

提前谢谢你!

按照要求,我从我的服务类中添加了(剥离的)代码。如你所见,并没有什么特别的事情发生:

代码语言:javascript
复制
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- &faulthandler的地方:

代码语言:javascript
复制
var token:AsyncToken = services.requestService.commit(new   Array(model.currentRequestDetail));
var responder:AsyncResponder = new AsyncResponder(resultHandler, faultHandler, token);
if ( token ) token.addResponder(responder);
EN

回答 2

Stack Overflow用户

发布于 2012-01-31 05:42:18

当您没有要提交的更改时,aysnctoken返回null。希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2012-01-03 05:24:40

WWW,这不是一个真正的答案,但我需要更多的空间,而不是评论给我的。然而,我看不出你所有的代码是如何很好地连接在一起的,从而给你一个好的答案。

一般来说,结果和错误签名不应该看起来像您所描述的“正确”签名。AsyncToken需要一个IResponder,它的错误和结果方法都有一个单独的参数,即一个对象。通常,这将与错误或结果事件一起调用(视情况而定)。

现在我要进入的领域,对我来说,纯粹是理论。在我看来,DataService类可能只创建一个AsyncToken,因为连接一直处于打开状态。如果是这种情况,则可能是错误的方法签名损坏了AsyncToken,以至于无法将其返回供方法使用。在您粘贴的代码中,我没有看到任何看起来像是以自定义方式调用您的结果和错误方法的内容。

我强烈怀疑问题出在Java代码中。AFAIK,创建并设置AsyncToken,以便在调用之前调用响应器中的函数(至少在HTTPService或amf中看起来是这样工作的)。我预计会有一些错误被“有帮助地”抑制,因此您可能会从单步执行代码中受益。

我建议你后退一步,仔细看看Robotlegs所暗示的MVCS架构的"S“部分,创建一个单独的服务类来管理整个事情,仅仅从一个命令开始这个过程,而不是试图在你的命令和服务之间来回传递控制。附带的好处是,当您不需要连接到实际数据(例如进行设计工作)时,您可以将实际服务的实例替换为测试服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8617644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档