如何关闭送入Response的InputStream(jax.rs)

时间:2015-12-16 08:06:33

标签: rest java-ee cxf

@GET
@Path("/{id}/content")
@Produces({ "application/octet-stream" })
public Response getDocumentContentById(@PathParam("id") String docId) {

    InputStream is = getDocumentStream(); // some method which gives stream
    ResponseBuilder responseBuilder = Response.ok(is);
    responseBuilder.header("Content-Disposition", "attachment; filename=" + fileName);
    return responseBuilder.build();

}

这里我如何关闭InputStream?如果某事(jax.rs)自动关闭。请给我一些信息。谢谢。

1 个答案:

答案 0 :(得分:2)

当您想要流式传输自定义响应时,我发现的最可靠的方法是返回包含InputStream的对象(或者可以通过其他方式获取流的对象)在某些时候),并定义一个MessageBodyWriter提供商,它将在适当的时间进行实际的流式传输。

例如,this code是Apache Taverna的一部分,它会流回目录的压缩内容。主代码使用它所需要做的就是返回ZipStream作为响应(可以打包在Response中),并确保它正在处理返回{{ 1}}内容类型。最后要注意的是,由于这是处理CXF,您需要手动注册提供程序;与Glassfish不同,它们不会被自动拾取。在复杂的场景中这是一件好事,但它确实意味着您需要进行注册。