背景:
在启动项目时,发送请求时报错
{ "msg": "java.io.IOException: Stream closed", "code": 500
}
具体报错:
I/O error while reading input message; nested exception is java.io.IOException: Stream closed
此异常是一个典型常见异常:通常在尝试操作一个已经关闭的流(如 InputStream
或 OutputStream
)时发生。这个异常通常是在错误地关闭流或多次关闭流后,再次进行读取或写入操作时引发的。
此处原因
- 多次读取流数据:比如拦截器已经读取了请求体中的内容,这时候Request请求的流中已经没有了数据,就会报错。
具体导致这个问题的原因是
对于分布式项目来说,会统一在网关进行请求转发,它是在其他功能模块之上的,这就会导致,在请求到达目标服务之前,某些拦截器或过滤器已经读取了请求体(request.getInputStream()
),导致请求体的流被关闭。当请求到达目标服务时,流已经被关闭,因此会抛出 Stream closed
错误。
解决方法
启动网关即可。
其他原因
- 流在使用前已经关闭:某个方法或代码段在使用流对象前已经将流关闭,再次操作该流时会引发
Stream closed
异常。 - 多次关闭流:某些情况下,流可能被多次关闭,再次关闭时不会抛出异常,但再次操作流时会导致
Stream closed
异常。 - 流对象传递不当:流对象被传递给多个方法或类,并且其中一个方法或类关闭了流,而其他方法或类仍然试图操作该流。
对于其他原因的解决方法
- 检查并调整流的关闭逻辑
- 使用
try-with-resources
自动关闭流,减少手动操作的错误。 - 避免在流被关闭后,仍然对流进行操作