【问题标题】:Do i need to flush or close the OutputStream in my custom Spring Web MessageConverter我是否需要在我的自定义 Spring Web MessageConverter 中刷新或关闭 OutputStream
【发布时间】:2016-06-21 07:03:08
【问题描述】:

我已经构建了一个自定义 Spring Web MessageConverter 并覆盖了 writeInternal 方法。

我应该在 getBody() OutputStream 上调用 flush 吗? 我应该关闭 getBody() 输出流吗?

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

我认为两者都不会,因为 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/json/GsonHttpMessageConverter.java#L203

然后 StringConverter 刷新但不关闭调用 https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-core/src/main/java/org/springframework/util/StreamUtils.java#L110https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java#L107

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

【问题讨论】:

  • 这个观察加一个。

标签: java spring spring-mvc spring-web


【解决方案1】:

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

您永远不应该调用 close() 方法,因为它会立即断开客户端套接字,并且由于客户端请求已经处理,因此它们将毫无意义地在服务器上进一步执行请求。它还将修剪掉所有可能导致各种错误情况的配置后过滤器和拦截器执行。

Why should we not call close method on response stream/writer?

响应流最终将在请求处理结束时由容器本身关闭,因此您不必担心手动调用它。只需编写您想要的自定义转换器即可。

此外,您不需要将内容作为缓冲输出流刷新,当缓冲区用完容量时,内容会自动刷新。

Gson 转换器可能会误用它,并且只要将 json 数据写入响应流,请求仍然会终止。正如您已经知道使用它们的后果。如果这真的会在您的情况下产生任何问题,那么您可以将MappingJackson2HttpMessageConverter 视为替代方案,它不会在将 json 字符串写入其中后close 输出流。

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

【讨论】:

  • 希望你也不要忘记关闭数据库连接。你永远不会关闭流的想法是疯狂的。如果框架可以处理它,那就没问题了。但是,如果您打开它,请关闭它。
  • 是的,这将由 J2EEE 指定的容器本身自动处理
  • 好吧..我没有在春天打开它
  • @PyThon 刷新呢?
  • 正如我所说的flush可以被多次调用,它不会影响任何东西,看问题是输出流已经是缓冲流并且会不时自动刷新,并且在关闭时以及。因此,即使您也在转换器中刷新它,它也不会产生任何影响,但是 close() 会产生一些负面影响。
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2013-03-15
相关资源
最近更新 更多