【问题标题】:Openfeign ErrorDecoder caused java.io.IOException: stream is closedOpenfeign ErrorDecoder 导致 java.io.IOException: stream is closed
【发布时间】:2020-08-11 18:58:37
【问题描述】:

当我尝试实现ErrorDecoder 来解码假装异常时,我发现response.body() 中的流已关闭,所以当我尝试读取流并转换为字符串时,它会抛出java.io.IOException: stream is closed。真的很困惑,因为在解码器之前,我没有做任何事情来关闭高级流。

public class FeignClientErrorDecoder implements ErrorDecoder {
    @Override
    public Exception decode(String methodKey, Response response) {
        log.info("feign client response: {}", response);
        String body = null;
        try {
            body = Util.toString(response.body().asReader(Charset.defaultCharset()));
        } catch (IOException e) {
            log.error("feign.IOException", e);
        }
        return new ServiceException(MessageCode.builder(ExceptionCodeEnum.ERROR));
    }
}

【问题讨论】:

    标签: java stream feign openfeign


    【解决方案1】:

    我经历了这个噩梦,这完全是 IDE 的错。

    调试模式下的断点在response.body().asReader 上方/之前导致流关闭。

    阅读正文后开始调试,一切顺利。

    【讨论】:

    • 伙计,你为我节省了很多时间!!!非常感谢!!!!
    • 你应该得到奖牌
    【解决方案2】:

    Logger / System.out.println / IDE 调试模式

    在获得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;
      }
    

    注意:如果您处于调试模式,那么您的 IDEA 将处理此响应,因此即使在这种情况下您也会收到相同的错误。所以请不要在调试模式下检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2018-04-10
      • 2019-01-12
      • 2023-03-25
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多