Подтвердить что ты не робот

Обработка ответов об ошибках сервера GWT RequestFactory

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

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

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

Я использую Chandler Generic DAO для Objectify 2 на http://turbomanage.wordpress.com/2010/02/09/generic-dao-for-objectify-2/

моя функция gwt вызывает persist (myProxy).fire(new Receiver < > )

мой код dao бросает IllegalArgumentException и другие RuntimeExceptions для бизнес-логических ситуаций, таких как "Дублированный адрес электронной почты, который вы хотите - вместо этого хотите войти в систему"?

Receiver < > . onSuccess() отлично работает, чтобы отслеживать успешный результат. ни Receiver <. onFailure(), ни Receiver < > . onViolation() не сообщают о RuntimeExceptions.

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

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

4b9b3361

Ответ 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

Томас Бройер onFailure должен содержать getMessage() исключение, которое вы выбрали на сервере боковая сторона.

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

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

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