如何从JAX-RS返回图像流?

时间:2012-08-24 21:15:00

标签: cxf jax-rs jackson

我正在尝试在JAX-RS Web服务中返回图像。我可以通过返回FileInputStream来成功完成此工作,但我更愿意避免为每个请求创建File

我正在使用Apache CXF和Jackson(所有其他资源方法都生成application / json)。

代码如下所示:

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

不幸的是,这会产生可怕的:

  

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor:376 - 没有消息   已经为响应类ByteArrayOutputStream找到了body writer。

Here's指向类似帖子的链接,但未提及我遇到的“无消息正文撰稿人”问题。

我很欣赏如何处理这个问题的任何想法。谢谢!

2 个答案:

答案 0 :(得分:20)

只需使用StreamingOutput包装器。由于某种原因,它是未知的,但它提供流媒体输出是伟大的。 : - )

答案 1 :(得分:8)

我认为你需要在Response.ok(out)中提供一个包含图像的InputStream而不是OutputStream。 (您的JAX-RS框架将读取InputStream中的字节并将它们放到响应中,它将无法通过OutputStream执行任何操作)

(我知道你在CXF上,但泽西岛的文档:http://jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324和JAX-RS规范,框架必须为InputStream提供MessageBodyWriter。)

编辑:你显然知道需要输入InputStreams,但是哦......你能控制QRCode类吗?

短期内,您可以这样做:

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