2011-03-11 74 views
23

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

flush()然后坚持()路径成功工作正常。 客户端JSR 303的工作原理也是如此。

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

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

我的GWT活动调用persist(MYPROXY).fire(新接收<>)

吾道代码抛出抛出:IllegalArgumentException等RuntimeExceptions对于业务逻辑情况,例如“找到重复的电子邮件地址 - 想要登录?”

接收器<> .onSuccess()可以很好地跟踪成功的结果。 既不是Receiver <> .onFailure()也不是Receiver <> .onViolation()报告RuntimeExceptions。

(更正:onFailure处()被调用服务器端例外)

有没有更好的方式来做到这一点? DAO抛出onViolation()或onFailure()会报错吗? 编辑器应该如何处理和从异常中恢复?

回答

0

我已经找到了最通用的命令序列是

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

托马斯Broyer onFailure处应方含中的getMessage谈话摘录() 例外,你扔在服务器 方。

您可以通过提供自己的 的ExceptionHandler到 RequestFactoryServlet调整它(扩展它,并 使用它的构造服用 的ExceptionHandler)。如果您 实体不通过JSR-303豆 验证,调用任何服务方法之前 其检查

onViolation才会被调用。

如果你想 “抓”在clidnt代码失败, 必须添加的 的接收器坚持()服务方法:
context.persist(P)。为了(新的接收器...