我正在基于密钥处理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中检查请求时,它看起来并不像是附加了数据。我错过了一些简单的东西吗?感谢。
编辑:以下是来自:
的回复Fiddler:http://i.imgur.com/DTtkByr.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 ...任何解决方法建议?
答案 0 :(得分:0)
除非有人已从流中读取,否则返回InputStream
应该有效。您无法从InputStream
读取两次。
答案 1 :(得分:0)
问题与打开InputStream有关。但是,RestEasy版本中存在一个错误,导致InputStream无法关闭。可在此处找到票证/修复:https://issues.jboss.org/browse/RESTEASY-741