据我了解,当请求以状态码!= 2xx响应时,将调用伪装的ErrorDecoder的encode()方法。通过调试我的测试,我发现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 repo中创建了一个最小的可复制示例。请查看提交历史记录,以找到我尝试过的3种方法。

最佳答案

问题是假冒客户使用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将其处理委托(delegate)给开发人员-例如,您可以检索HTTP状态和响应正文,并对其进行处理。
如果有兴趣,可以查看feign.SynchronousMethodHandler的源代码executeAndDecode部分。
要解决此问题,请在状态代码= 2xx(可能是某些DTO类)的正确响应的情况下,将Response.class替换为所需的类型。我做了一个PR,为了简单起见,我将其更改为String

关于spring - Feign ErrorDecoder不被调用-如何配置feign以使用它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62453241/

10-10 11:41