0



RobotLegs、LiveCycle DS、およびJavaを使用してFlexアプリケーションを開発しています。LCDSを使用して更新機能を実装しようとしていますが、奇妙な動作が発生しています。

これは、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で更新されます。
ただし、このコードが2回実行されると、services.requestService.commit()関数はnull値を返し、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>




簡単に言え
ば、誰かが手がかり/経験を持っていますか、なぜ私が2回目にservices.requestService.commit();関数を実行すると、nullの非同期トークンが返されるのですか?




事前に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();          
    }
}
}



これは私の結果とフォールトハンドラーが追加されるチョードです:

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

2 に答える 2

1

コミットする変更がない場合、aysnctoken は null を返します。お役に立てれば。

于 2012-01-30T21:42:18.100 に答える
0

WWW、これは実際には答えではありませんが、コメントよりも多くのスペースが必要です。ただし、すべてのコードが適切に接続されているため、適切な回答が得られるかどうかはわかりません。

一般に、結果と障害のシグネチャは、「正しい」シグネチャとは異なります。AsyncToken は IResponder を予期しています。IResponder の fault および result mentod には、オブジェクトである単一のパラメーターがあります。通常、これはフォルト イベントまたは結果イベントで呼び出されます (必要に応じて)。

今、私は純粋に理論的な領域に入っています。接続が開いたままになっているため、DataService クラスは AsyncToken を 1 つだけ作成する可能性があるように思えます。その場合、誤ったメソッド シグネチャによって AsyncToken が破損し、メソッドで使用するために AsyncToken を返すことができなくなる可能性があります。あなたが貼り付けたコードには、result メソッドと fault メソッドを独自の方法で呼び出しているように見えるものは何もありませんでした。

問題が Java コードにあるとは思えません。私の知る限り、呼び出しが行われる前に、AsyncToken が作成され、レスポンダーの関数を呼び出すように設定されます (少なくとも、HTTPService または amf で動作するようです)。「役立つ」ように抑制されているエラーがあると予想されるため、コードをステップ実行することでメリットが得られる可能性があります。

Robotlegs が暗示する MVCS アーキテクチャの "S" 部分をもう少し詳しく見て、全体を管理する別のサービス クラスを作成し、単にコマンドからプロセスを開始することをお勧めします。コマンドとサービスの間で制御をやり取りするのではなく、副次的な利点として、実際のデータに接続する必要がない場合 (設計作業を行う場合など) に、実際のサービスのインスタンスをテスト サービスに交換できます。

于 2012-01-02T21:24:39.613 に答える