RESTEasy:返回InputStream作为响应

时间:2014-11-26 18:01:54

标签: java rest resteasy

我正在基于密钥处理PUT和GET InputStream对象的服务 - 这些可以是从基本字符串到文件的任何内容。这是PUT方法似乎工作正常:

@PUT
@Path("{key}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response addData(
    final @PathParam("key") String key,
    final InputStream data) {
  final Service service =  new Service();
  try {
    service.addData(key, data);
  } finally {
    IOUtils.closeQuietly(data
  }
  return Response.status(204).build();
}

现在,当我想获取数据(基于密钥)时,我想返回InputStream,这是对象的存储和检索方式。这就是我目前所拥有的:

@GET
@Path("/{key}")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
  public InputStream getData(
    @PathParam("key") String key) {
  // get service and do other stuff ...
  return service.getData(); //This is an InputStream
}

当我发送GET时,我获得状态200并且“响应不包含任何数据”#39;消息...当我在Fiddler中检查请求时,它看起来并不像是附加了数据。我错过了一些简单的东西吗?感谢。

编辑:以下是来自:

的回复

似乎没有任何反应,但我不确定。有没有一种好方法来测试它是否返回InputStream?


Edit2:有趣。根据peeskillet建议阅读数据,看看它是否在那里我做到了:

final String data = IOUtils.toString(stream);

当它应该返回""时返回"test"。现在我对IOUtils并不是非常熟悉,所以他们的toString(InputStream)可能导致它"test",但这表明它在服务中没有正确设置。

我获取InputStream数据的服务如下所示:

final InputStream data = getData(_key);
  try {
    if (data == null) {
      return null;
    }
    return object.newBuilder()
      .setKey(_key)
      .setData(data)
      .build();
  } finally {
    IOUtils.closeQuietly(data);
  }

服务中的任何内容都会导致流被读取,从而使其无法访问吗?


Edit3:当我设置要返回的数据时,问题在于服务。如果我删除IOUtils.closeQuietly(data);,我就可以恢复数据了。但是这会导致问题,因为我打开了一个InputStream ...任何解决方法建议?

2 个答案:

答案 0 :(得分:0)

除非有人已从流中读取,否则返回InputStream应该有效。您无法从InputStream读取两次。

答案 1 :(得分:0)

问题与打开InputStream有关。但是,RestEasy版本中存在一个错误,导致InputStream无法关闭。可在此处找到票证/修复:https://issues.jboss.org/browse/RESTEASY-741