2014-06-12 10 views
5

Ich suche nach einer Möglichkeit, JSON-Posts in einem RESTEASY-Framework zu protokollieren.Loggen von JSON-Posts mit Resteasy

Ich möchte gerne den POST-Body protokollieren, um zu sehen, was der Client mir sendet.

Gibt es einen Interceptor oder etwas ähnliches, das ich verwenden kann, habe ich ein Beispiel für PreProcessInterceptor gefunden, aber es sieht so aus, als wäre es veraltet.

Ich bin mit Resteasy 3.0.8

Antwort

6

können Sie verwenden, um eine 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)); 

    } 

} 

Statt für Verfahren zur Überprüfung und Content-Type Sie können auch diesen Filter registrieren pro @NameBinding nur, wo Sie brauchen es.

Hinweis: Dieses einfache Beispiel kopiert den InputStream der Anforderung, so dass es zweimal gelesen wird (möglicherweise ein Leistungsproblem).

2

Als Ergänzung der ausgezeichneten Antwort von lefloh, schlage ich ersetzen:

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

mit

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

equals Methode berücksichtigt Parameter von Medientyp, zB. charset = UTF-8, und funktioniert in einigen Szenarien nicht nach Absicht von Lefloh. isCompatible vergleicht nur Typ und Untertyp des Medientyps und ist in diesem Fall besser geeignet.

PS. Ich weiß, dieser Beitrag sollte als Kommentar platziert werden, aber ich habe nicht genug Ansehen, um es zu tun. Ich habe auch die Lefloh-Antwort bearbeitet, aber einige PHP- und iOS-Leute haben das abgelehnt.