обработка ответов об ошибках сервера GWT RequestFactory - PullRequest
23 голосов
/ 11 марта 2011

У меня есть недавно закодированное приложение GWT / GAE, которое использует RequestFactory и Editors на клиенте и пользовательскую службу Objectify DAO на оборотной стороне.

Пути flush () затем persist () работают нормально при успехе.Клиентская сторона JSR 303 работает так же, как и можно ожидать.

Мой вопрос заключается в том, как вызывать серверные предупреждения / ошибки и обрабатывать обновления пользовательского интерфейса?

Я использую общий DAO Чандлера для Objectify 2 вhttp://turbomanage.wordpress.com/2010/02/09/generic-dao-for-objectify-2/

моя активность gwt вызывает постоянный вызов (myProxy) .fire (новый получатель <>)

мой дао-код вызывает исключение IllegalArgumentException и другие исключения RuntimeException для ситуаций бизнес-логики, таких как «Дублированный адрес электронной почты»нашел - хочешь вместо логина войти?

Receiver <>. OnSuccess () отлично работает для отслеживания успешного результата.ни Receiver <>. onFailure (), ни Receiver <>. onViolation () не сообщают об исключениях RuntimeException.

(Исправление: onFailure () вызывается для исключений на стороне сервера)

Есть ли лучший способ сделать это?Какие исключения должен выдавать DAO, чтобы onViolation () или onFailure () сообщали об ошибках?Как редактор (-ы) должны обрабатывать и восстанавливаться после исключения?

1 Ответ

0 голосов
/ 13 мая 2011

Я нашел наиболее универсальную последовательность команд:

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 () исключения, которое вы сгенерировали на стороне сервера.

Вы можете настроить его, предоставив свой собственный ExceptionHandler для RequestFactoryServlet (расширьте его и используйте его конструктор, используя ExceptionHandler).

onViolation будет вызываться только в том случае, если ваши сущности не проходят проверку компонентов JSR-303, которая проверяется перед вызовом любого метода службы.

Если вы хотите «перехватить» ошибку в коде clidnt, вы должны добавить Receiver для метода службы persist ():
context.persist (p) .to (новый Receiver…

...