GWT:向服务器发出请求后继续编辑同一对象

GWT:向服务器发出请求后继续编辑同一对象,gwt,requestfactory,gwt-2.4,requestcontext,Gwt,Requestfactory,Gwt 2.4,Requestcontext,在GWT服务器请求后是否可以继续编辑同一对象 考虑代码中的最佳实践 void start(){ //要么得到p context1.get(..).to(新接收器{onSuccess(P resp){P=resp;}…}).fire(); //或者创建p p=context2.create(p.class); //然后保存p req=context2.persist(p).to(新接收器){/*注意不要使用context1*/ onViolation(…){/*JSR303处理程序*/}; onF

在GWT服务器请求后是否可以继续编辑同一对象

考虑代码中的最佳实践

void start(){
//要么得到p
context1.get(..).to(新接收器

{onSuccess(P resp){P=resp;}…}).fire(); //或者创建p p=context2.create(p.class); //然后保存p req=context2.persist(p).to(新接收器){/*注意不要使用context1*/ onViolation(…){/*JSR303处理程序*/}; onFailure(error){/*handle*/error.getMessage()}; onSuccess(X X){/*which persist()返回处理程序*/};}); //带p的驱动器编辑器 驱动程序编辑(p,req); } .... void onSave(){ //编辑 ctxt=driver.flush()/*注意ctxt==context2*/ if(driver.hasrerrors()){/*JSR 303 handler*/}; //射频 ctxt.fire(); }

问题是,如何处理最后一行中未成功的服务器响应?(将接收器添加到“ctxt.fire();”)

void onSave(){
//编辑
ctxt=driver.flush()/*注意ctxt==context2*/
if(driver.hasrerrors()){/*JSR 303 handler*/};
//射频
ctxt.火灾(新接收器{
onSuccess(){…如何继续编辑“p”对象?..}
onFailure(){…如何继续编辑“p”对象?..});
});
}
例如,在保存时,服务器执行一些附加验证(例如,该值是唯一的)。并且不接受保存它

所以,服务器请求使用“onSuccess(response)”方法完成,但对象未保存(响应值可能包含错误列表)

是否允许用户继续编辑未保存但在客户端更新的对象,并向服务器发出另一个请求

我看到的“僵局”:

  • 无法重用请求上下文(ctxt),因为将引发“请求已在进行”异常
  • 不可能创建新上下文,因为对对象的所有修改都在旧上下文中(因此它们将丢失)

可变代理始终绑定到请求上下文。但是,从服务器接收的代理是冻结的,不可更改。.edit方法将为给定请求上下文创建冻结代理的可变克隆

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

查看
AbstractRequestContext
中的
onTransportSuccess
——这将告诉您:您可以继续使用请求上下文的唯一情况是冲突和一般故障。因此,要么强制执行冲突,要么将(错误的)对象返回给客户机,并使用新的请求上下文继续处理它(这将导致实体代理出现问题,因为它将失去引用状态)

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();
}
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? ... } });
    });
}