12

我正在尝试在 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 找到消息正文编写器。

这是一个类似帖子的链接,但它没有提到我遇到的“没有消息正文作者”问题。

我将不胜感激有关如何处理此问题的任何想法。谢谢!

4

2 回答 2

25

只需使用StreamingOutput包装器。出于某种原因,它是未知的,但它非常适合提供流输出。:-)

于 2012-08-26T04:21:40.720 回答
9

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

(我知道您使用的是 CXF,但 Jersey 的文档:http: //jersey.java.net/nonav/documentation/latest/jax-rs.html#d4e324并且根据 JAX-RS 规范,框架必须提供 MessageBodyWriter对于输入流。)

编辑:你显然知道 InputStreams 是必需的,d'oh ...你可以控制 QRCode 类吗?

短期内,您也许可以:

return Response.ok(out.toByteArray()).build();
于 2012-08-24T21:23:31.593 回答