Jersey POST 请求并关闭 InputStream

Posted

技术标签:

【中文标题】Jersey POST 请求并关闭 InputStream【英文标题】:Jersey POST Requests and closing the InputStream 【发布时间】:2014-08-31 15:57:35 【问题描述】:

当我在 Jersey 中有一个监听 POST 请求的方法,并且当我在要从中获取数据的方法中有一个 InputStream 作为参数时,我需要关闭这个 InputStream 还是由 Jersey 处理这个?

我没有找到任何关于它的信息。不久前我读过带有 JAX-RS 2.0 的 RESTful Java,但我不记得是否提到过。现在浏览了一下,发现了几个代码示例,并且流没有关闭。我觉得没必要,但想问问。

【问题讨论】:

你找到答案了吗?我将把 inputStream 作为引用变量传递给 EJB 并在 try-finally 块中将其关闭。你怎么看? @AzamatAlmukhametov 我也想知道你是否找到了答案 【参考方案1】:

如何获得 InputStream 引用?通过 MessageBodyReader?在这种情况下,如果您使用的是 MessageBodyReader,则不能关闭 InputStream。文档中甚至对此有明确的警告。

7.2.2.2. MessageBodyReader.readFrom

无论如何,此链接适用于 Jersey v2。我不知道版本 1 是什么。你用的是哪个版本?

【讨论】:

抱歉回复晚了。它不在 MessageBodyReader 中,我已经知道不要关闭那些或 MessageBodyWriter 中的输出。这是您在执行 POST 请求时获得的 InputStream。未使用 @QueryParam@PathParam 之类的注释的方法参数是 InputStream 或从客户端发送到服务器的数据。【参考方案2】:

我有同样的问题,但当前的答案没有回答不使用MessageBodyReader 时的问题。对于那些确实想知道在 SO 上还有其他两个答案的人(one,two)

简短的回答和总结是在 InputStream 上调用close()

背景:

一个用户调试了它,流没有自动关闭 close() 方法是幂等的,因此第二次调用不会受到伤害 大多数用户说要 close() 或使用可关闭的 try-with-resources-statements

【讨论】:

以上是关于Jersey POST 请求并关闭 InputStream的主要内容,如果未能解决你的问题,请参考以下文章

jersey rest post 访问为http 405 异常如何解决

Jersey中的常用注解总结

HttpClient GET和POST请求

jersey之get,put,post,delete简单使用

如何使用 Jersey 获取完整的 REST 请求正文?

POST 到 Jersey REST 服务收到错误 415 Unsupported Media Type