JAX-RS 2 drucken JSON-Anfrage
Ich würde gerne in der Lage sein zu drucken, JAX-RS, 2-JSON-payload von request, unabhängig von der tatsächlichen Implementierung auf meinem Applikationsserver.
Ich habe versucht die vorgeschlagenen Lösungen SO, aber alle enthalten Binärdateien, die aus der tatsächlichen Umsetzung (wie Jersey und ähnliche), und ich darf nur zu verwenden, Java ee-api v 7.0 in meiner Anwendung.
Habe ich versucht, die Umsetzung ClientRequestFilter und ClientResponseFilter auf meinem Client aber nicht enthalten serialisierte Entitäten.
Hier ist ein Beispiel-client:
WebTarget target = ClientBuilder.newClient().register(MyLoggingFilter.class).target("http://localhost:8080/loggingtest/resources/accounts");
Account acc = target.request().accept(MediaType.APPLICATION_JSON).get(account.Account.class);
Und hier ist die Implementierung von MyLoggingFilter:
@Provider
public class MyLoggingFilter implements ClientRequestFilter, ClientResponseFilter {
private static final Logger LOGGER = Logger.getLogger(MyLoggingFilter.class.getName());
@Override
public void filter(ClientRequestContext requestContext) throws IOException {
LOGGER.log(Level.SEVERE, "Request method: {0}", requestContext.getMethod());
}
@Override
public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
LOGGER.log(Level.SEVERE, "Response status: {0}", responseContext.getStatus());
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deshalb gibt es ein paar Dinge zu beachten, wenn Sie versuchen, dies umzusetzen
Für die request-entity, werden Sie wollen, dass die Serialisierung zu werden, Griff durch den Rahmen, das heißt, Sie nicht wollen, etwas zu tun, wie
Hier sind Sie serialisieren es selbst, vielleicht mit Hilfe von Jackson
ObjectMapper
oder so etwas. Sie könnte tun es auf diese Weise, aber es ist eine Art beschränkt, in der Art damit umgehen kann. Wenn Sie lassen Sie das Objekt serialisiert werden, wie es bereits gehandhabt, indem der Rahmen, der Rahmen wird in der Lage sein, zu unterstützen, viel mehr Arten als nur JSON.Lassen, Rahmen Griff der Serialisierung, und noch in der Lage sein serialisiert die Daten, die wir benötigen, um ein
WriterInterceptor
. Was wir tun können, ist legen Sie die entity-output-stream zu einemByteArrayOutputStream
, und lassen Sie dann das framework serialisiert die Anfrage Objekt unsereByteArrayOutputStream
dann anschliessend melden Sie diese bytes. Dies ist, wie das TrikotLoggingFilter
diese verarbeitet.Für die Antwort, in unserem filter, müssen wir extrahieren Sie die Daten aus dem response-stream, aber auch wir müssen sicherstellen, dass der stream noch Daten, es wurde nicht deserialisiert noch für den Kunden. Um dies zu tun
mark()
undreset()
den Strom, vorausgesetzt, die Kennzeichnung unterstützt wird. Wenn nicht, wickeln Sie es in einBufferedOutputStream
. Wieder, dies ist, wie das TrikotLoggingFilter
diese verarbeitet.Unten ist eine komplette einfache Umsetzung. Das meiste davon ist gerade von der Jersey
LoggingFilter
, wenn es abgespeckte nur für Ihren Fall. Das TrikotLoggingFilter
meldet eine Menge von anderen Informationen, abgesehen von den nur die Einheit. Eine Sache, die ich ging, ist die Prüfung für das charset. Ich habe gerade verwendet eine hart codierte UTF-8, wie dieMessageUtil
verwendete Klasse von Jersey, Jersey ist spezifisch. Wenn Sie wollen, um den filter ist universeller für andere Zeichensätze, möchten Sie vielleicht zu suchen in der Festsetzung.Siehe Auch:
LoggingFilter
EntityLoggingFilter
bekomme ich eine NullPointerException aufResponse response = target.request(MediaType.APPLICATION_JSON).post(Entity.json(path));
. Gibt es irgendeinen offensichtlichen Grund, warum die übergabe einer Unterklasse nicht funktionieren würde? Es ist auch nicht anrufen, mein Unterklasse-Konstruktor, und die NPE passiertat org.jboss.resteasy.core.ConstructorInjectorImpl.<init>(ConstructorInjectorImpl.java:45) [resteasy-jaxrs-3.0.10.Final.jar:]