Beispiel für die Verwendung von StreamingOutput als Antwortentität in Jersey

74

Kann jemand ein Beispiel dafür veröffentlichen, wie in Jersey StreamingOutputeine Entität in einem ResponseObjekt festgelegt werden soll?

Ich konnte kein Beispiel dafür finden.

David Loy
quelle

Antworten:

121

Sehen Sie, ob dies hilft:

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response streamExample() {
  StreamingOutput stream = new StreamingOutput() {
    @Override
    public void write(OutputStream os) throws IOException,
    WebApplicationException {
      Writer writer = new BufferedWriter(new OutputStreamWriter(os));
      writer.write("test");
      writer.flush();  // <-- This is very important.  Do not forget.
    }
  };
  return Response.ok(stream).build();
}
bedingen
quelle
28
AAAAARRRRRRRRRRRRRRRRRRRRH. Ich habe gerade vier Stunden damit verbracht herauszufinden, warum mein Trikot-Rest-Service keine Datei gestreamt hat. Ich habe meinem Schriftsteller keinen Flush gegeben. Sooooooo nervig. Danke, dass du mich gerettet hast!
Will
2
Leider geben weder die JAX-RS V 1.1-Spezifikation noch die Java EE 6-Javadocs an, ob der angegebene Ausgabestream geschlossen werden soll oder nicht. In Anbetracht des vorhergehenden Kommentars vermute ich jedoch, dass Sie tatsächlich OutputStream.close () anstelle von OutputStream.flush () aufrufen sollten. Dadurch werden möglicherweise einige interne Ressourcen freigegeben, die dem Ausgabestream zugeordnet sind.
Christian Schlichtherle
1
@ 卢 声 远 ShengyuanLu Sie können auch ein verwenden, MessageBodyWriteraber bei dieser Frage ging es um das Streaming mit einem ResponseObjekt. Mit MessageBodyWriterbist du verpflichtet, an eine zu schreiben OutputStream.
Bedingung
4
Vielen Dank für diese Antwort, aber wie zum Teufel bekomme ich dieses StreamingOutput-Objekt aus der Antwort auf der Clientseite?
Koem
3
@prongs + Nagyl: Ja, ich habe es herausgefunden: InputStream ist = ClientBuilder.newBuilder (). register (MultiPartFeature.class) .build (). target (BASE_URI) .path ("/ yourservice"). request (). get () .readEntity (InputStream.class); (Alles in einem "Satz", es könnte gut sein, dies in
Client-