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),因为会抛出“A request is already in progress”异常。
  • 不可能创建新的上下文,因为对对象的所有修改都在旧上下文中(因此它们将丢失)。
4

1 回答 1

1

可变代理总是绑定到请求上下文。但是,您从服务器接收到的代理被冻结且不可变。.edit 方法将为给定的请求上下文创建一个冻结代理的可变克隆。

如果无法触发请求(连接问题、服务器错误),上下文将可重用,您可以继续编辑代理。如果违反了约束,同样适用。如果请求成功触发(无论服务器方法是否抛出异常),则不能再使用请求上下文,代理也是如此。

看看onTransportSuccessin AbstractRequestContext- 这会告诉你:你可以继续使用请求上下文的唯一情况是违规和一般失败。因此,要么强制执行违规,要么将(错误的)对象返回给客户端并继续使用新的请求上下文处理它(这将导致实体代理出现问题,因为它会丢失参考状态)

于 2012-09-13T20:57:53.190 回答