当我尝试实现ErrorDecoder
来解码假异常时,我发现response.body()
中的流是关闭的,所以当我尝试读取流并转换为字符串时,它抛出java.io.IOException: stream is closed
。这真的很困惑,因为在解码器之前,我没有做任何事情来提前关闭流。
Stack Overflow用户
发布于 2020-06-05 02:02:26
我经历了这个噩梦,这都是IDE的错。
调试模式中的断点在导致流关闭的response.body().asReader
结束/之前。
只需在读取正文后开始调试,一切都很顺利。
Stack Overflow用户
发布于 2020-09-22 19:31:07
记录器/ System.out.println /集成开发环境调试模式
在获取response.body()
之前,不要使用上述任何功能
如果您使用上面的任何特性来打印/记录/查看您的response
对象,那么它将在内部处理response.body()
并关闭InputStream
。因此,在这种情况下,您将得到Stream is closed
错误。
要解决此问题,请在记录器之前处理response.body()
。现在,您可以通过运行应用程序来检查这一点,但不能在调试模式下运行。
示例代码:
@Override
public Exception decode(final String methodKey, final Response response) {
final String error = getResponseBodyAsString(response.body());
LOGGER.error("{} failed with response {}", methodKey, response);
return new ServiceException("Request failed with status: " + response.status()
+ " and error: " + error);
}
private String getResponseBodyAsString(final Response.Body body) {
try {
return IOUtils.toString(body.asReader(StandardCharsets.UTF_8));
} catch (final IOException e) {
LOGGER.error("Failed to read the response body with error: ", e);
}
return null;
}
注意:如果您处于调试模式,那么您的想法将处理此响应,因此即使在这种情况下,您也会得到相同的错误。因此,请不要在调试模式下检查此选项。
原文链接:Openfeign ErrorDecoder导致java.io.IOException:流已关闭-腾讯云开发者社区-腾讯云