2011-12-23 4 views
0



フレックス:LCDSサービスは

2回目を実行したときに、私はRobotLegsは、LiveCycle DS & Javaを使用してFlexアプリケーションを開発していヌルのAsyncTokenを返します。 私はLCDSを使用して、更新機能を実装しようとしているが、私はいくつかの奇妙な行動に実行しているよ:

これはRobotLegs' executeコマンド、アップデートを実行するために使用 内のActionScriptコードです:

私は更新しようとしている model.currentRequestDetail
var token:AsyncToken = services.requestService.commit(new Array(model.currentRequestDetail)); 
responder = new AsyncResponder(resultHandler, faultHandler, token); 
if (token) token.addResponder(responder); 



は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は​​関数によってうまく返されます。 resultHandlerは期待通りに実行され、オブジェクトはGUIで更新されます。
ただし、このコードが2回実行されると、私の​​関数はnull値を返し、my 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) 
を0



我々はまた、これはコードで、カスタムの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 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要が追加されchodeです:

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

サービスクラスまたはrequestEservicesオブジェクトのコードは何ですか。参照される方法は、何かの欲求のようなものです。少なくともDemeterの法則に違反していますが、もしあなたがRobotlegsを使っているならば、そこに静的メソッドを潜在的に潜んでいる可能性もあります。 –

+0

こんにちは@AmyBlankenship、読んで返信する時間を取ってくれてありがとう。私は元の記事の最後にサービスクラスのコードを追加しました。 事前に – WWWillems

+0

resultとfaultメソッドが追加されたコードを追加できますか?ほとんどの場合(LCDSは含まれません)、結果およびフォルト・ハンドラーは単一のパラメーター(イベント)のみを持ち、非同期トークンはそのイベントのプロパティーです。以前はLCDSを使用していなかったので、何が起きているのかを正確に把握する必要があります。 –

答えて

0

WWWを、このISN」本当にそのような答えはありませんが、私はコメントが私に与えるよりも多くのスペースが必要です。しかし、あなたのコードがどれだけうまく接続されているか分かりません。

一般的に、結果とフォルトの署名はではなく、のようになります。 AsyncTokenは、不具合と結果の指示にという単一のパラメータを持つIResponderがObjectであることを期待しています。一般的に、これはfaultまたはresultイベント(必要に応じて)で呼び出されます。

今私は、私にとって、純粋に理論的な領域に入っています。接続が開いたままになっているため、DataServiceクラスはただ1つのAsyncTokenを作成する可能性があります。この場合、誤ったメソッドのシグネチャが、メソッドで使用するために返されない範囲でAsyncTokenを破損する可能性があります。あなたが貼り付けたコードの中に、あなたの結果とフォールトメソッドをカスタムメソッドで呼び出すようなものは何も見ませんでした。

私はこの問題がJavaコードにあることを強く疑う。 AFAIKでは、AsyncTokenが作成され、呼び出しが行われる前にレスポンダの関数を呼び出すように設定されています(少なくともHTTPServiceまたはamfで動作するように見えます)。 「有益に」抑制されているエラーがあることが予想されますので、コードをステップ実行することで恩恵を受ける可能性があります。

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

+0

こんにちは@AmyBlankenship、このリンク: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/rpc/AsyncResponder.html私の結果と障害ハンドラは正しいです。 1つの接続またはリクエストごとに1つのAsyncTokenしかないかどうかはわかりません。個人的には、私のAsyncTokenが誤ったメソッドシグネチャによって「破損」しているとは思わない。私はアイデアがなくなっているので、あなたが提案したように、別のサービスクラスを作成しようと考えています。あなたの時間のThx – WWWillems

1

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

関連する問題