2011-03-11 15 views
23

Tengo una aplicación GWT/GAE recientemente codificada que usa RequestFactory y Editors en el cliente y un servicio DAO Objectify personalizado en la parte posterior.manejo de las respuestas de error del servidor GWT RequestFactory

Las rutas flush() then persist() funcionan bien en caso de éxito. El lado del cliente JSR 303 funciona tan bien como se puede esperar.

Mi pregunta es cómo desencadenar las advertencias/errores del servidor y manejar las actualizaciones de la interfaz de usuario.

estoy usando de Chandler DAO genérico para Objectify 2 en http://turbomanage.wordpress.com/2010/02/09/generic-dao-for-objectify-2/

mi actividad GWT está llamando a persistir (myproxy) .fire (nuevo receptor <>)

mi código DAO está lanzando IllegalArgumentException y otros RuntimeExceptions para situaciones de lógica empresarial como "¿Se ha encontrado una dirección de correo electrónico duplicada? ¿Quieres iniciar sesión?"

Receptor <> .onSuccess() funciona bien para rastrear un resultado exitoso. ni Receiver <> .onFailure() ni Receiver <> .onViolation() informan las RuntimeExceptions.

(Corrección: onFailure) se está llamando para las excepciones del lado del servidor()

¿Hay una mejor manera de hacer esto? ¿Qué excepciones debería arrojar el DAO de manera que onViolation() o onFailure() informaran de errores? ¿Cómo deberían los redactores manejar y recuperarse de la excepción?

Respuesta

0

que he encontrado la secuencia de comandos más versátil para ser

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

Basado en el pasaje siguiente conversación enhttp://groups.google.com/group/google-web-toolkit/browse_thread/thread/da863606b3893132/96956661c53e1064?hl=en

Thomas Broyer onFailure debe containg getMessage() de la excepción que arrojó en el lado del servidor .

Puede modificarlo, proporcionando a su propia ExceptionHandler a la RequestFactoryServlet (extenderlo y usar su constructor teniendo una ExceptionHandler).

onViolation sólo se llama si sus entidades no pasan JSR-303 Haba de validación, que se comprueba antes de llamar a cualquier método servicio.

Si desea "atrapar" el fracaso en el código clidnt, hay que añadir un receptor para el persistir() método de servicio:
context.persist (p) .para (nuevo receptor ...

Cuestiones relacionadas