【问题标题】:RESTEasy: return InputStream in responseRESTEasy:返回 InputStream 作为响应
【发布时间】:2023-04-06 02:42:01
【问题描述】:

我正在开发基于键的 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 和“响应不包含任何数据”消息......当我在 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 处于打开状态...有什么解决方法建议吗?

【问题讨论】:

  • 尝试从资源方法内部读取流并返回 that 结果而不是流。看看它是否返回任何东西
  • 我在原始帖子中添加了更多信息...感谢您的建议。看来我很明显在服务层做错了什么。
  • 如果您关闭流 RESTeasy 无法从中读取。您可以尝试在资源方法中关闭流。但我怀疑你是否会通过所有层进行真正的流式传输。
  • 我尝试将它包装在资源中的 try/finally 块中,try 获取 InputStream 并返回它,然后finally 关闭流,但我得到与以前相同的结果.我假设流首先关闭,然后它尝试返回不存在的内容。
  • 您是否考虑从 getData() 方法返回其他内容而不是 InputStream?可能是byte[]。见here

标签: java rest resteasy


【解决方案1】:

除非有人已经从流中读取,否则返回 InputStream 应该可以工作。您不能从 InputStream 中读取两次。

【讨论】:

  • 据我所知,InputStream 根本没有被读取。这是 Advanced Rest Client (i.imgur.com/OfSSAxj.jpg) 和 Fiddler (i.imgur.com/DTtkByr.jpg) 中的响应。好像什么都没有,但不知道有没有好办法验证有没有。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2015-11-14
    • 2021-09-09
    • 2021-01-24
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多