Schließen JAX-RS Client/Antwort
Es ist nicht klar, muss ich schließen, JAX-RS Client - /Response-Instanzen oder nicht. Und wenn ich muss, immer oder nicht?
Laut Dokumentation über die Client-Klasse:
Aufruf dieser Methode effektiv für ungültig erklärt, alle Ressourcen-Ziele
produziert von der client-Instanz.
Den WebTarget-Klasse ist kein invalidate()/close () - Methode, aber die Antwort Klasse.
Nach Dokumentation:
Schließen Sie die zugrunde liegende Nachricht entity-input-stream (wenn verfügbar und
open) sowie Veröffentlichungen sonstiger Ressourcen im Zusammenhang mit der
Reaktion (beispielsweise eine gepufferte Nachricht entity data).... Die close () - Methode
sollte aufgerufen werden, die auf alle Instanzen, die eine un-Person verbraucht
input-stream zu gewährleisten, die Ressourcen in Verbindung mit der Instanz sind
richtig aufgeräumt und verhindern, dass potenzielle memory leaks. Dies ist
typisch für client-side-Szenarien, in denen die Anwendung layer code
Prozesse, die nur der response-Header und ignoriert die Antwort Einheit.
Letzten Absatz ist mir nicht klar. Was bedeutet "un-verbraucht entity-input-stream" bedeuten? Wenn ich eine InputSteam oder eine Zeichenfolge aus der Antwort, sollte ich in der Nähe der Antwort explizit?
Können wir eine Antwort bekommen Ergebnis ohne Zugriff auf Antwort Beispiel:
Client client = ...;
WebTarget webTarget = ...;
Invocation.Builder builder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
Invocation invocation = builder.buildGet();
InputStream reso = invocation.invoke(InputStream.class);
Arbeite ich mit RESTeasy Umsetzung, und ich erwartete, dass Antwort geschlossen werden innerhalb von resteasy Umsetzung, aber ich konnte Sie nicht finden. Könnte mir jemand sagen warum?
Ich weiß, dass die Antwort-Klasse implementieren, die Verschließbar-Schnittstelle
Aber auch wissen, die Antwort ist, ohne es zu schließen.
SyncInvoker.get(Class)
.InformationsquelleAutor Alexandr | 2015-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gemäß der Dokumentation
close()
ist idempotent.So können Sie sicher schließen Sie die
InputStream
sich selbst und sollte.Dass gesagt wird ich Stil weisen nicht tun würde
invocation.invoke(InputStream.class)
alsinvoker(Class)
für tun entity transformation. Stattdessen, wenn Sie möchten InputStream sollten Sie vielleicht rufen Sie einfachinvocation.invoke()
und befassen sich mit derResponse
Objekt direkt, wie Sie möchten können Sie einige header-Informationen vor dem Lesen des Streams.Der Grund, warum Sie wollen, Kopfzeilen, wenn der Umgang mit einer Antwort
InputStream
ist typisch, weil Sie entweder don ' T care über den Körper oder der Körper erfordert spezielle Verarbeitung und Größe überlegungen, die ist, was die Dokumentation ist in Anspielung auf (z.B.HEAD
ping-Anfrage an server).Siehe auch link
Also, wenn Sie wählen Sie etwas anderes als
InputStream
Sie nicht haben, um in der Nähe derResponse
(aber unabhängig sein sicher tun es trotzdem als seine idempotent).InformationsquelleAutor Adam Gent
Blick in die
resteasy-client
QuellcodeInvocation#invoke(Class<T>)
ist einfach aufrufenInvocation#invoke()
und ruftInvocation#extractResult(GenericType<T> responseType, Response response, Annotation[] annotations)
zu extrahieren, das Ergebnis aus derResponse
:Invocation#extractResult(GenericType<T> responseType, Response response, Annotation[] annotations)
schließt die Antwort in derfinally
block:InformationsquelleAutor Daniel Shuy