处理 GWT RequestFactory 服务器错误响应

发布于 2024-10-21 05:23:17 字数 855 浏览 1 评论 0原文

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

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

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

我正在使用 Chandler 的 Generic DAO for 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() 报告错误? 编辑者应该如何处理异常并从中恢复?

I have a newly coded GWT/GAE app that uses RequestFactory and Editors on the client and a custom Objectify DAO Service on the back.

The flush() then persist() paths work fine on success.
Client side JSR 303 works as well as can be expected too.

My question is how to trigger server warnings/errors and handle UI updates?

I am using Chandler's Generic DAO for Objectify 2 at
http://turbomanage.wordpress.com/2010/02/09/generic-dao-for-objectify-2/

my gwt activity is calling persist( myProxy ).fire( new Receiver<> )

my dao code is throwing IllegalArgumentException and other RuntimeExceptions for business logic situations like "Duplicate email address found - want to login instead?"

Receiver<>.onSuccess() works fine to track a successful outcome.
neither Receiver<>.onFailure() nor Receiver<>.onViolation() report the RuntimeExceptions.

( Correction: onFailure() is being called for server-side exceptions)

Is there a better way to do this?
What exceptions should the DAO throw such that onViolation() or onFailure() report errors?
How should the editor(s) handle and recover from the exception?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泡沫很甜 2024-10-28 05:23:17

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

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

托马斯·布罗耶
onFailure 应该包含 getMessage()
你在服务器上抛出的异常
边。

您可以通过提供自己的内容来调整它
异常处理程序
RequestFactoryServlet(扩展它并
使用它的构造函数
异常处理程序)。

只有在以下情况下才会调用 onViolation
您的实体未通过 JSR-303 Bean
验证,之前检查过
调用任何服务方法。

如果你愿意
“捕获”客户端代码中的失败,
你必须添加一个接收器
persist() 服务方法:
context.persist(p).to(新接收者...

I've found the most versatile command sequence to be

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

Based on the conversation excerpt below at http://groups.google.com/group/google-web-toolkit/browse_thread/thread/da863606b3893132/96956661c53e1064?hl=en

Thomas Broyer
onFailure should containg the getMessage() of the
exception you threw on the server
side.

You can tweak it by providing your own
ExceptionHandler to the
RequestFactoryServlet (extend it and
use its constructor taking an
ExceptionHandler).

onViolation will only be called if
your entities do not pass JSR-303 Bean
Validation, which is checked before
calling any service method.

If you want to
"catch" the failure in clidnt code,
you have to add a Receiver for the
persist() service method:
context.persist(p).to(new Receiver…

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文