当前位置: 首页 > 知识库问答 >
问题:

我需要刷新或关闭自定义Spring Web MessageConverter中的OutputStream吗

松琦
2023-03-14

我构建了一个自定义的Spring Web MessageConverter并重写了WriteInterral方法。

不同的转换器之间似乎有很大的不匹配。

因为spring希望刷新输出流,所以我认为这两个都不行(参见https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/abstractgenerichttpmessageconverter.java#l101

但后来我看到gson实际上在关闭溪流?这仅仅是一个错误还是一种想要的行为?https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/html" target="_blank">json/gsonHttpMessageConverter.java#l203

然后StringConverter刷新但不关闭https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/https/converter/stringhttpmessageconverter.java#l107,调用

所以在现有技术中并没有看到明确的答案...

共有1个答案

居乐池
2023-03-14

永远不要在任何地方调用close()方法。

您不应该调用close()方法,因为它会立即断开客户机套接字的连接,并且当客户机请求已经被处理时,它们将没有必要在服务器上进一步执行请求。此外,它还将裁剪所有配置的后过滤器和拦截器执行,可能导致各种错误条件。

为什么我们不应该在响应流/写入器上调用close方法?

Gson转换器可能错误地拥有它,并且当json数据被写入响应流时,请求仍然会终止。因为您已经知道使用它们的后果。如果这真的会在您的情况下产生任何问题,那么您可以考虑将Jackson2HttpMessageConverter映射为替代方案,在将json字符串写入输出流之后,它不会关闭输出流。

但是如果您正在编写一个新的转换器,那么最好不要关闭代码中的任何地方的流。

 类似资料:
  • 问题内容: 我有一个网站,它的点击率很高,我遇到了问题,JDCB连接错误。 我对关闭有点困惑,我需要关闭还是仅关闭就足够了。 另外,我需要关闭它吗? 问题答案: 是的,您必须关闭PreparedStatement和结果集,因为它们可能导致内存泄漏。有关更多信息,请访问 http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

  • 问题内容: 我的代码是: 在文档中: InputStream的close方法不执行任何操作。 这是否意味着我不需要关闭InputStream? 问题答案: 您确实需要关闭输入Stream,因为您提到的方法返回的流实际上是FileInputStream或该文件的某个其他子类,该子类包含文件的句柄。如果不关闭此流,则可能会导致资源泄漏。

  • 我有一个网站,点击量很大。我遇到过一些问题,包括JDBC连接错误。 我对结束PreparedStatement有点困惑。我需要关闭PreparedStatement吗?还是只需要关闭语句就足够了? 另外,呢?我也需要关闭它吗?

  • 几个月前,我在使用java.sql时了解到了这一点。连接我需要关闭PreparedStatements和ResultSet,以防止内存泄漏,如下所述 然而,我最近开始与一个使用org.sql2o的新团队合作。连接,这是一个很好且有用的jdbc包装器,但我注意到它们通常不会关闭其org.sql2o。查询对象。 如您所见,查询对象从未显式关闭。我认为最好同时关闭查询: 但我不确定这是否真的有必要。如果

  • 我已经在我的应用程序中使用创建了线程池,以调用供应商Web服务,使用下面的代码。 我想知道我们是否需要关闭线程池之类的,基本上我不希望在正式生产环境中挂起线程。

  • 我在我的应用程序中保存了和的一个实例,每次我想执行一些操作时,我都会调用。 我想知道我是否需要显式关闭连接,就像JDBC中的一样。 要强调的是,我只有一个实例。我的问题不是关于关闭,而是关闭我相信它在调用时打开的连接。