据我了解,当请求以状态码!= 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/