3

GWT サーバーのリクエスト後に同じオブジェクトを編集し続けることはできますか?

別の質問からベスト プラクティス コードを検討する

void start() {
    // Either get p
    context1.get(..).to( new Receiver<P> { onSuccess(P resp){p = resp;} ... }).fire();
    // OR create p
    p = context2.create( P.class );
    // Then save p
    req = context2.persist(p).to( new Receiver<P>{  /* note do not use context1 */
        onViolation(...) { /*JSR 303 handler*/ };
        onFailure( error ) { /* handle */ error.getMessage() }; 
        onSuccess(X x) { /* whatever persist() returns handler */ }; } ); 
    // drive editor with p
    driver.edit( p, req);    
}

....
void onSave() {    
    // editor
    ctxt = driver.flush()  /* note ctxt == context2 */
    if ( driver.hasErrors() ) { /*JSR 303 handler*/};
    // RF
    ctxt.fire();
}

問題は、最後の行で失敗したサーバーの応答をどのように処理するかです。(受信機を「ctxt.fire();」に追加)

void onSave() {    
    // editor
    ctxt = driver.flush()  /* note ctxt == context2 */
    if ( driver.hasErrors() ) { /*JSR 303 handler*/};
    // RF
    ctxt.fire(new Receiver<S>{
        onSuccess() { ... how to continue editing the "p" object? ... } 
        onFailure() { ... how to continue editing the "p" object? ... } });
    });
}

たとえば、保存時に、サーバーは追加の検証を行います (たとえば、その値は一意です)。そしてそれを保存することを受け入れません。

そのため、サーバー リクエストは「onSuccess(response)」メソッドで終了しますが、オブジェクトは保存されませんでした (レスポンス値にはエラーのリストが含まれる場合があります)。

ユーザーが保存されていないがクライアント側で更新されたオブジェクトの編集を続行し、サーバーに別のリクエストを行うことは可能ですか?

私が見る「デッドロック」:

  • 「リクエストはすでに進行中です」という例外がスローされるため、リクエスト コンテキスト (ctxt) を再利用することはできません。
  • オブジェクトへのすべての変更は古いコンテキストにあるため (失われるため)、新しいコンテキストを作成することはできません。
4

1 に答える 1

1

可変プロキシは、常にリクエスト コンテキストにバインドされます。ただし、サーバーから受け取るプロキシは凍結されており、変更できません。.edit メソッドは、特定のリクエスト コンテキストの凍結されたプロキシの変更可能なクローンを作成します。

リクエストを発行できなかった場合 (接続の問題、サーバー エラー)、コンテキストは再利用可能になり、プロキシの編集を続行できます。制約に違反した場合も同様です。リクエストが正常に起動された場合 (サーバー メソッドが例外をスローしたかどうかに関係なく)、リクエスト コンテキストは使用できなくなり、同じことがプロキシにも適用されます。

を見てくださいonTransportSuccess-AbstractRequestContextこれはあなたに教えてくれます: リクエストコンテキストを使い続けることができる唯一のケースは、違反と一般的な失敗です. したがって、違反を強制するか、(誤った) オブジェクトをクライアントに返し、新しい要求コンテキストで作業を続行します (参照状態が失われるため、エンティティ プロキシで問題が発生する可能性があります)。

于 2012-09-13T20:57:53.190 に答える