gpt4 book ai didi

spring-cloud-feign - 如何使用 Feign Error Decoder 消除流关闭错误?

转载 作者:行者123 更新时间:2023-12-04 15:22:55 29 4
gpt4 key购买 nike

我有一个像这样构建的假客户端服务:

Feign.Builder builder = Feign.builder()
.contract(new SpringMvcContract())
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.errorDecoder(new FeignClientErrorHandler())
return builder.target(targetClass, url);
我有 FeignClientErrorDecoder看起来像这样:
public class FeignClientErrorDecoder implements ErrorDecoder {

private static final ObjectMapper MAPPER = new ObjectMapper().registerModule(new JavaTimeModule());

@Override
public Exception decode(final String methodKey,
final Response response) {
try {
byte[] body = Util.toByteArray(response.body().asInputStream());
ApiError apiError = MAPPER.readValue(body, ApiError.class);
return ExceptionFactory.createFrom(apiError);
} catch (IOException | ApiErrorException e) {
return new TechnicalClientException("Could not extract error payload.", e);
}
}

}
无论我选择哪种阅读输入流解决方案,我总是得到一个 stream is closed错误。
我错过了什么?谁在关闭它?任何解决方法?
完整代码在这里:
https://github.com/louisamoros/feign-error-code
您可以运行 mvn clean install并看到 1 个测试出错。

最佳答案

感谢您提供完整的代码。由于 response 的日志记录而发生错误在错误解码器中:

LOGGER.error("Feign client error handler. Method: {}, Response: {}", methodKey, response);
在这里, toString()被调用响应,包括它的主体。因此,响应主体的输入流在那里被读取并关闭,以后无法再次读取。
您可以删除 response从记录或复制其输入流(通过 apache IOUtils 或类似的),然后使用其副本。在这种情况下,映射器将成功解析所有内容和下一行 return new ApiException()将达到。
顺便说一下,调试这种代码时要小心。现代 IDE(例如 IntelliJ IDEA)可以调用 toString()在默认情况下到达断点时作用域中的所有对象,因此也可能因此出现相同的问题。在这里,您可以安全地将断点放在 MAPPER.readValue 之后。线。

关于spring-cloud-feign - 如何使用 Feign Error Decoder 消除流关闭错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62929527/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com