1

据我了解,当请求响应状态码!= 2xx 时,将调用 feign ErrorDecoder 的 decode() 方法。通过调试我的测试,我发现我的 CustomErrorDecoder 的 decode() 方法没有在例如 504 或 404 上调用。我尝试了两种配置方法:

将其作为 Bean 包含在客户端配置中:

    @Bean
    public CustomErrorDecoder customErrorDecoder() {
        return new CustomErrorDecoder();
    }

或将其写入应用程序配置:

feign:
  client:
    config:
      myCustomRestClientName:
        retryer: com.a.b.some.package.CustomRetryer
        errorDecoder: com.a.b.some.package.CustomErrorDecoder

两种方式都不会调用 ErrorDecoder。我究竟做错了什么?Bean 正在实例化,我的 CustomErrorDecoder 如下所示:

@Component
public class CustomErrorDecoder implements ErrorDecoder {

    private final ErrorDecoder defaultErrorDecoder = new Default();

    @Override
    public Exception decode(String s, Response response) {
        Exception exception = defaultErrorDecoder.decode(s, response);

        if (exception instanceof RetryableException) {
            return exception;
        }

        if (response.status() == 504) {
            // throwing new RetryableException to retry 504s
        }
        return exception;
    }
}

更新:

我在这个 git 仓库. 请查看提交历史以找到我尝试过的 3 种方法。

4

1 回答 1

2

问题是您的 feign 客户端feign.Response用作返回类型:

import feign.Param;
import feign.RequestLine;
import feign.Response;

public interface TestEngineRestClient {

    @RequestLine(value = "GET /{uuid}")
    Response getReport(@Param("uuid") String uuid);
}

在这种情况下,Feign 将其处理委托给开发人员——例如,您可以检索 HTTP 状态和响应正文并用它做一些事情。

如果有兴趣,可以看一下feign.SynchronousMethodHandler,executeAndDecode部分的源代码。

要解决此问题,Response.class请在状态码 = 2xx(可能是某些 DTO 类)的正确响应的情况下替换为所需的类型。为了简单起见,我做了一个PR,我将其更改String为。

于 2020-06-25T16:32:18.970 回答