2010-11-16 7 views
9

Decidí agregar el sistema de registro a la capa de servicio de gwt. En primer lugar, quería registrar todas las excepciones que se lanzan desde esa capa. Tenía un objeto similar al ServletDispatcher de Spring, que llama a otros servicios. Pensé que podría agregar el registro allí, pero me di cuenta de que los servicios de GWT ajustan excepciones marcadas en ServletResponse y desmarcadas en UnexpectedException.Prácticas recomendadas para el registro de excepciones de servicios GWT

¿Alguien puede compartir su experiencia con ese problema? ¿Cuál es la mejor manera de registrar las excepciones marcadas y no revisadas para todos los servicios de GWT?


I conocer solución que sugiere extender fluyen excepciones RemoteServiceServlet y de anulación por defecto. Pero esta solución me lleva demasiado tiempo. ¿Conoce Anybode alguna variante más fácil?

Respuesta

12

En el lado del servidor, tenemos una subclase de RemoteServiceServlet que usamos para todas las implementaciones de servicios. Usted menciona que parece consumir mucho tiempo, pero así es como se ve el código. Lo haces una vez y terminas.

@Override 
protected void doUnexpectedFailure(Throwable t) { 
    t.printStackTrace(System.err); 
    super.doUnexpectedFailure(t); 
} 

Nota: En realidad no enviarlo a System.err y probablemente tampoco debería hacerlo, pero se entiende la idea.

En el lado del cliente, usamos una subclase de AsyncCallback llamada AsyncSuccessCallback. Maneja el caso onFailure de manera uniforme para la mayoría de nuestras llamadas RPC. La mayor parte de nuestro código de devolución de llamada puede tratar el caso onSuccess sabiendo que se maneja onFailure. También proporciona un lugar único para cambiar esta implementación más adelante.

public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> { 

    public void onFailure(Throwable t) { 
     handleException(t); 
    } 

    protected void handleException(Throwable t) { 
     Window.alert(t.getMessage()); 
    } 

} 

Nota: En realidad, no usamos Window.alert, pero de nuevo, se entiende. Lo que hacemos en este caso es mostrar un GWT DialogBox que muestra un formulario que hace una POST a un servidor diferente que acepta informes de errores. El formulario permite al usuario escribir una descripción de lo que estaban haciendo cuando ocurrió el error.

En el lado del cliente, si desea obtener el seguimiento de la pila, es necesario escribir un poco de código extra:

// for lineEnding, use "<br>" for HTML, "\n" for text 
public static final String getStackTrace(Throwable t, String lineEnding) { 
    Object[] stackTrace = t.getStackTrace(); 
    if (stackTrace != null) { 
     StringBuilder output = new StringBuilder(); 
     for (Object line : stackTrace) { 
      output.append(line); 
      output.append(lineEnding); 
     } 
     return output.toString(); 
    } else { 
     return "[stack unavailable]"; 
    } 
} 
+0

No lo he probado todavía, pero parece ser la solución correcta. Lo intentaré tan pronto como tenga una tarea conectada con el registro. Hasta ese momento lo marqué como correcto. – Zalivaka

1

¿Qué excepciones desea registrar? Lado del cliente o del lado del servidor? Tenemos una gran aplicación empresarial con gwt. Usamos el patrón MVP en el cliente y todas las solicitudes al servidor se hacen usando una clase de servicio RPC genérica. Por ejemplo saveUserService = new remoteService();

en el lado del servidor procesamos SaveUserRequest y preparamos SaveUserResponse usando el patrón de comando. Todas las excepciones se tratan allí, aparte de la ClientWarningException que se deja propagar hasta el cliente donde mostramos un bonito mensaje para el usuario.

Esto es quizás un poco detallado, pero se amplió bien en una gran aplicación con 100k loc.

+0

Antes que nada necesito los registros del lado del servidor para la capa de servicio. – Zalivaka

+0

Acerca de su sugerencia, no está claro para mí. ¿Puedes explicarlo? Según tengo entendido, envuelve la excepción en el objeto de respuesta, ¿está construida de esa manera? – Zalivaka

+0

Todas las excepciones en el lado del servidor ya deben estar registradas por su registro de elección (o sysout). Decidimos tratar algunas excepciones de una manera especial y dejar que se eleven al cliente para brindarle al usuario información útil. Por ejemplo, errores de validación. – Uberto

1

Uso gwt-dispatch. El registro puede integrarse en el servicio de envío estándar, como se muestra en la siguiente muestra, que levanté de la página de envío de gwt Getting Started.

public class SimpleDispatchServlet extends RemoteServiceServlet 
     implements StandardDispatchService { 

    private Dispatch dispatch; 

    public SimpleDispatchServlet() { 
     InstanceActionHandlerRegistry registry = 
      new DefaultActionHandlerRegistry(); 
     registry.addHandler(new IncrementCounterHandler()); 
     dispatch = new SimpleDispatch(registry); 
    } 

    public Result execute(Action<?> action) throws DispatchException { 
     try { 
      return dispatch.execute(action); 
     } catch (RuntimeException e) { 
      log("Exception while executing " + action.getClass().getName() 
       + ": " + e.getMessage(), e); 
      throw e; 
     } 
    } 
} 
Cuestiones relacionadas