2012-09-11 33 views
10

Abbiamo i servizi REST esposti tramite Spring MVC. Usiamo un HandlerExceptionResolver per registrare le eccezioni. Al momento nel registro i seguenti:Come posso registrare i dati post RESTful?

  • L'eccezione e la sua analisi dello stack
  • l'URL
  • Le intestazioni di richiesta

Renderebbe più facile il debug se potremmo anche registrare i dati JSON Post come bene. Qualche suggerimento su come ottenere questo?

risposta

10

È necessario un filtro che salverà il corpo della richiesta durante la lettura e fornirà i dati salvati al log delle eccezioni in seguito.

La molla contiene AbstractRequestLoggingFilter che fa la stessa cosa. Anche se non è direttamente adatto al tuo problema, puoi usarlo come riferimento per implementare il tuo filtro.

+1

Se stai usando Primavera 4.1.3+ (vedi SPR-12477), assicurarsi di mappare il filtro al MVC Dispatcher Servlet e non a '/* ', o la tua richiesta non verrà avvolta nell'essenziale' ContentCachingRequestWrapper'. –

+1

@ LászlóvandenHoek, puoi elaborare? Io non ti seguo. Sto usando 'ContentCachingRequestWrapper', ma il corpo della richiesta è sempre una stringa vuota. –

+0

I filtri @AbhijithMadhav sono abilitati mappandoli su un pattern URL o su un servlet. Quello che intendevo era che dovresti assicurarti di mappare il tuo "AbstractRequestLoggingFilter" al tuo dispatcher, non al pattern URL "/ *". –

4

Non esiste un modo semplice per registrare il carico utile della richiesta/risposta. È possibile utilizzare un filtro Web java per intercettare tutte le richieste e le risposte e leggere i dati JSON dallo stream. Ma c'è un problema, quando leggerai i dati dal flusso, i dati effettivi saranno esauriti dal flusso.

Pertanto, è necessario implementare il wrapper dell'oggetto effettivo di richiesta e risposta. Verrà registrata solo la versione copiata della risposta alla richiesta. Abbiamo implementato una soluzione simile come segue ed è soddisfatto la nostra esigenza:

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

Aggiungere questo alla classe che rappresenta la configurazione per l'applicazione:

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

potrebbe essere necessario commentare

f.setIncludePayload(true); 
Problemi correlati