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

Jus*_*tin 11 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();
}
Run Code Online (Sandbox Code Playgroud)

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

org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor:376 - 没有为响应类ByteArrayOutputStream找到消息正文编写器.

这是一个类似帖子的链接,但它没有提到我遇到的"无消息体作者"问题.

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

Sta*_*Man 22

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

  • 对流使用toByteArray通常是个坏主意,因为这基本上会将整个流放入内存中.因此,如果您的文件是1GB,则JVM中至少需要1GB.如果有多个用户正在访问您的服务,则每个用户将额外添加1GB,这将关闭您的服务器.我总是建议直接使用流. (6认同)

Cha*_*lie 8

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

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

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

短期内,您可以做到:

return Response.ok(out.toByteArray()).build();
Run Code Online (Sandbox Code Playgroud)