2014-06-12 12 views
5

Sto cercando un modo per registrare i post JSON in un framework RESTEASY.Registrazione di messaggi json con ristagno

Mi piacerebbe registrare il corpo del POST per registrare il file per vedere cosa mi sta mandando il cliente.

C'è un intercettore o qualcosa di simile che posso usare, ho trovato un esempio per PreProcessInterceptor ma sembra che sia deprecato.

sto usando RESTEasy 3.0.8

risposta

6

È possibile utilizzare un ContainerRequestFilter:

@Provider 
public class LogFilter implements ContainerRequestFilter { 

    private Logger LOG = LoggerFactory.getLogger(LogFilter.class); 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 

     if (!"POST".equals(requestContext.getMethod()) 
       || !MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType()) 
       || requestContext.getEntityStream() == null) { 
      return; 
     } 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     IOUtils.copy(requestContext.getEntityStream(), baos); 
     byte[] bytes = baos.toByteArray(); 
     LOG.info("Posted: " + new String(bytes, "UTF-8")); 
     requestContext.setEntityStream(new ByteArrayInputStream(bytes)); 

    } 

} 

Invece di controllare per il Metodo e Content-Type è anche possibile registrare questo filtro per @NameBinding solo dove è necessario esso.

Nota: Questo semplice esempio copia l'InputStream della richiesta in modo che venga letto due volte (forse un problema di prestazioni).

2

come integratore di ottima risposta di lefloh, suggerisco sostituire:

!MediaType.APPLICATION_JSON_TYPE.equals(requestContext.getMediaType()) 

con

!MediaType.APPLICATION_JSON_TYPE.isCompatible(requestContext.getMediaType()) 

equals metodo tiene conto di parametri del tipo di supporto, ad esempio. charset = UTF-8, e non funziona in alcuni scenari secondo l'intenzione di lefloh. isCompatible confronta solo tipo e sottotipo di tipo di supporto ed è più adatto in questo caso.

PS. Lo so, questo post dovrebbe essere inserito come commento, ma non ho abbastanza livello di reputazione per farlo. Ho anche curato la risposta di Lefloh ma alcuni php e ios lo hanno rifiutato.

Problemi correlati