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) を再利用することはできません。
- オブジェクトへのすべての変更は古いコンテキストにあるため (失われるため)、新しいコンテキストを作成することはできません。