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.

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();
}

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-
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.