Гибкость: служба LCDS возвращает нулевой Asynctoken при втором выполнении



Я разрабатываю приложение Flex с использованием RobotLegs, LiveCycle DS и Java. Я пытаюсь реализовать функцию обновления с помощью LCDS, но у меня странное поведение:

Это код ActionScript внутри команды execute RobotLegs, используемой для выполнения обновления:

 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 выполняется, как ожидалось, и мой объект обновляется в графическом интерфейсе.
Однако во второй раз, когда выполняется этот код, моя функция 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?




Заранее спасибо!




По запросу я добавил (вырезанный) код из моего класса услуг. Как видите, ничего особенного не происходит:

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);

person WWWillems    schedule 23.12.2011    source источник
comment
Какой код у вашего класса услуг и / или объекта requestEservices. В том, как на это ссылаются, есть что-то вроде запаха. По крайней мере, вы нарушаете закон Деметры, но, возможно, вы даже внедряете статический метод в него, чего нет смысла когда-либо делать, если вы используете Robotlegs.   -  person Amy Blankenship    schedule 23.12.2011
comment
Привет, @AmyBlankenship, спасибо, что нашли время, чтобы прочитать и ответить. Я добавил код из моего класса услуг в конец своего исходного сообщения. спасибо заранее   -  person WWWillems    schedule 29.12.2011
comment
Можете ли вы добавить код, в который добавлены методы результата и ошибки? В большинстве случаев (не включая LCDS) обработчики результатов и ошибок имеют только один параметр, событие, а асинхронный токен является свойством этого события. Поскольку я раньше не использовал LCDS, мне нужно ТОЧНО видеть, что вы делаете, чтобы понять, что происходит.   -  person Amy Blankenship    schedule 31.12.2011


Ответы (2)


Aysnctoken возвращает null, если у вас нет изменений для фиксации. Надеюсь это поможет.

person Swathi    schedule 30.01.2012

WWW, На самом деле это не ответ как таковой, но мне нужно больше места, чем мне может дать комментарий. Однако я не вижу, насколько хорошо весь ваш код связан, чтобы дать вам хороший ответ.

В общем, сигнатуры результата и ошибки не должны не выглядеть так, как вы описываете как «правильную» сигнатуру. AsyncToken ожидает IResponder, чьи ментоды ошибок и результатов имеют единственный параметр, который является объектом. Как правило, это будет вызываться с событием сбоя или результата (при необходимости).

Теперь я выхожу на территорию, которая для меня является чисто теоретической. Мне кажется, что класс DataService мог бы создать только один AsyncToken, поскольку соединение остается открытым. Если это так, возможно, что ошибочная подпись метода повреждает AsyncToken до такой степени, что он не может быть возвращен для использования методом. Я не увидел в вставленном вами коде ничего, что выглядело бы так, как будто он вызывает ваши методы результата и ошибки особым образом.

Сильно сомневаюсь, что проблема в Java-коде. AFAIK, AsyncToken создается и настраивается для вызова функций в ответчике до того, как вызов будет выполнен (по крайней мере, так он работает с HTTPService или amf). Я ожидал, что есть какая-то ошибка, которая «услужливо» подавляется, поэтому вам может быть полезно пошаговое выполнение кода.

Я бы посоветовал вам немного отступить и немного внимательнее взглянуть на S-часть архитектуры MVCS, подразумеваемую Robotlegs, и создать отдельный класс обслуживания, который управляет всем этим, и просто запускать процесс из команды, вместо того, чтобы пытаться передавать управление между вашими командами и службами. В качестве дополнительного преимущества вы можете заменить экземпляры реальной службы на службы тестирования, когда вам не нужно подключаться к фактическим данным (например, для выполнения проектных работ).

person Amy Blankenship    schedule 02.01.2012
comment
Привет, @AmyBlankenship, по этой ссылке: help .adobe.com / en_US / FlashPlatform / reference / actionscript / 3 / mx / мои обработчики результатов и ошибок верны. Я не знаю, есть ли только 1 AsyncToken на соединение или на запрос. Я лично не думаю, что мой AsyncToken «поврежден» из-за ошибочной сигнатуры метода. Думаю, я попытаюсь создать отдельный класс обслуживания, как вы предложили, поскольку у меня заканчиваются идеи. Спасибо за ваше время - person WWWillems; 04.01.2012