【发布时间】: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 中检查请求时,它看起来不像附加了数据。我在这里错过了一些简单的东西吗?谢谢。
编辑:以下是来自的回复:
高级 Rest 客户端:http://i.imgur.com/OfSSAxj.jpg
回复似乎没有附加任何内容,但我不确定。有没有好方法来测试它是否返回 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