2012-09-11 11 views
10

Tenemos servicios REST expuestos a través de Spring MVC. Usamos un HandlerExceptionResolver para registrar excepciones. Actualmente registramos la siguiente:¿Cómo puedo registrar datos de publicación RESTful?

  • La excepción y su seguimiento de la pila
  • la URL
  • Las cabeceras de petición

Se haría más fácil la depuración si también podríamos registrar los datos de correos JSON como bien. ¿Alguna sugerencia sobre cómo obtener esto?

Respuesta

10

Necesita un filtro que guarde el cuerpo de la solicitud cuando se está leyendo y luego proporcione los datos guardados a su registrador de excepciones.

Spring contiene AbstractRequestLoggingFilter que hace lo mismo. Aunque no es directamente adecuado para su problema, puede usarlo como referencia para implementar su propio filtro.

+1

Si está utilizando Spring 4.1.3+ (ver SPR-12477), asegúrese de asignar el filtro para su MVC Dispatcher Servlet y no a '/* ', o su solicitud no quedará envuelta en el' ContentCachingRequestWrapper' esencial. –

+1

@ LászlóvandenHoek, ¿Pueden dar más detalles? Yo no te sigo Estoy usando 'ContentCachingRequestWrapper', pero el cuerpo de la solicitud siempre es una cadena vacía. –

+0

Los filtros @AbhijithMadhav se habilitan asignándolos a un patrón de URL o a un servlet. Lo que quise decir es que debe asegurarse de asignar su 'AbstractRequestLoggingFilter' a su despachador, no al patrón de URL'/''. –

4

No hay una manera fácil de registrar la carga de la solicitud/respuesta. Puede usar un filtro web java para interceptar todas las solicitudes y respuestas y leer los datos JSON de la transmisión. Pero hay un problema: cuando lea los datos de la transmisión, los datos reales se agotarán de la transmisión.

Por lo tanto, debe implementar el contenedor del objeto de solicitud y respuesta real. Solo se registrará la versión copiada de la respuesta de solicitud. Hemos implementado una solución similar como sigue y se satisface nuestro requisito:

http://www.wetfeetblog.com/servlet-filer-to-log-request-and-response-details-and-payload/431

http://angelborroy.wordpress.com/2009/03/04/dump-request-and-response-using-javaxservletfilter/

16

añadir esto a la clase que representa la configuración de la aplicación:

import javax.servlet.Filter; 
import javax.servlet.http.HttpServletRequest; 
import org.springframework.web.filter.AbstractRequestLoggingFilter; 

....

@Bean 
public Filter loggingFilter(){ 
    AbstractRequestLoggingFilter f = new AbstractRequestLoggingFilter() { 

     @Override 
     protected void beforeRequest(HttpServletRequest request, String message) { 
      System.out.println("beforeRequest: " +message); 
     } 

     @Override 
     protected void afterRequest(HttpServletRequest request, String message) { 
      System.out.println("afterRequest: " +message); 
     } 
    }; 
    f.setIncludeClientInfo(true); 
    f.setIncludePayload(true); 
    f.setIncludeQueryString(true); 

    f.setBeforeMessagePrefix("BEFORE REQUEST ["); 
    f.setAfterMessagePrefix("AFTER REQUEST ["); 
    f.setAfterMessageSuffix("]\n"); 
    return f; 
} 

puede que tenga que comentar

f.setIncludePayload(true); 
Cuestiones relacionadas