处理 GWT RequestFactory 服务器错误响应

2022-09-01 23:55:47

我有一个新编码的GWT / GAE应用程序,它在客户端上使用RequestFactory和编辑器,并在背面使用自定义的Objectify DAO服务。

flush() 然后 persist() 路径在成功时工作正常。客户端 JSR 303 工作正常,也可以预期。

我的问题是如何触发服务器警告/错误并处理UI更新?

我正在使用钱德勒的通用DAO进行Objectify 2 http://turbomanage.wordpress.com/2010/02/09/generic-dao-for-objectify-2/

我的 gwt 活动正在调用 persist( myProxy ).fire( new Receiver<> )

我的 dao 代码正在为业务逻辑情况抛出 IllegalArgumentException 和其他 RuntimeException,例如“找到重复的电子邮件地址 - 想要登录吗?

Receiver<>.onSuccess() 可以很好地跟踪成功的结果。Receiver<>.onFailure() 和 Receiver<>.onViolation() 都没有报告 RuntimeExceptions。

( 更正:onFailure() 正在调用服务器端异常)

有没有更好的方法来做到这一点?DAO 应该抛出哪些异常,以便 onViolation() 或 onFailure() 报告错误?编辑器应如何处理异常并从中恢复?


答案 1

我发现最通用的命令序列是

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

基于下面的对话摘录,http://groups.google.com/group/google-web-toolkit/browse_thread/thread/da863606b3893132/96956661c53e1064?hl=en

Thomas Broyer onFailure 应该包含您在服务器端抛出的异常的 getMessage()。

您可以通过向 RequestFactoryServlet 提供自己的 ExceptionHandler 来调整它(扩展它并使用其构造函数获取 ExceptionHandler)。

仅当实体未通过 JSR-303 Bean 验证时,才会调用 onViolation,在调用任何服务方法之前都会检查该验证。

如果你想在 clidnt 代码中“捕获”故障,你必须为 persist() 服务方法添加一个 Receiver:
context.persist(p).to(new Receiver...


答案 2

推荐