2012-08-24 21 views
9

estoy tratando de devolver una imagen en un servicio web JAX-RS. Yo era capaz de conseguir este funcionamiento con éxito mediante la devolución de FileInputStream pero preferiría evitar la creación de un File para cada solicitud.¿Cómo devolver la imagen como una transmisión desde JAX-RS?

estoy usando Apache CXF y Jackson (todos los demás métodos de recursos producen application/json).

código es el siguiente:

@GET 
@Produces("image/png") 
public Response getQrCode(@QueryParam("qrtext") String qrtext) { 

    ByteArrayOutputStream out = QRCode.from(qrtext).to(ImageType.PNG).stream(); 

    return Response.ok(out).build(); 
} 

Desafortunadamente, esto produce la temida:

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor: 376 - Ningún mensaje escritor cuerpo ha sido encontrado para la clase de respuesta ByteArrayOutputStream.

Here's un enlace a una publicación similar pero no menciona el problema "No hay mensaje de cuerpo del mensaje" con el que me estoy encontrando.

lo agradecería cualquier idea de cómo hacer frente a este problema. ¡Gracias!

+0

Por qué no vuelve la corriente directamente en lugar de envolverlo en una respuesta? –

Respuesta

8

creo que es necesario para proporcionar un InputStream que contiene la imagen en el Response.ok (fuera), no un OutputStream. (Su marco JAX-RS leería los bytes de InputStream y los pondría en la respuesta, no podría hacer nada genéricamente con un OutputStream)

(Sé que está en CXF, pero el documento de Jersey : http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324 y según la especificación JAX-RS, la infraestructura debe proporcionar un MessageBodyWriter para InputStream.)

Editar: Aparentemente sabe que se requieren InputStreams, d'oh ... ¿Tiene control sobre la clase QRCode?

corto plazo, es posible que pueda hacer:

return Response.ok(out.toByteArray()).build(); 
+0

gracias. tu respuesta fue de gran ayuda. Response.ok (out.toByteArray()). Build() funciona muy bien. – Justin

19

sólo tiene que utilizar StreamingOutput envoltura. Por alguna razón, se desconoce, pero es excelente para proporcionar, bueno, salida de transmisión. :-)

+0

Gracias Tatu. La devolución de StreamingOutput es preferible a simplemente devolver la matriz de bytes directamente como la entidad de respuesta? – Justin

+0

Como siempre, "depende". Si ya tiene 'byte []', probablemente no haga diferencia. – StaxMan

+6

Por lo general, es una mala idea usar toByteArray para las transmisiones, ya que básicamente pondrá toda la secuencia en la memoria. Entonces, si su archivo es de 1GB, necesitará al menos 1GB en la JVM. Si varios usuarios acceden a su servicio, cada usuario agregará 1GB adicional, lo que reducirá su servidor. Siempre recomiendo usar transmisiones directamente. – apanosa

Cuestiones relacionadas