Feign ErrorDecoder не вызывается - как настроить feign для его использования? - PullRequest
1 голос
/ 18 июня 2020

Насколько я понимаю, метод decode () симулируемого ErrorDecoder будет вызываться, когда запрос отвечает кодом состояния! = 2xx. Отлаживая свои тесты, я обнаружил, что метод decode () моего CustomErrorDecoder не вызывается, например, на 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;
    }
}

Обновление:

Я создал минимальный воспроизводимый пример в this git repo . Просмотрите историю коммитов, чтобы найти 3 способа, которые я пробовал.

1 Ответ

1 голос
/ 25 июня 2020

Проблема в том, что ваш воображаемый клиент использует 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 и ответ body и поработайте с ним.

Если интересно, вы можете посмотреть исходный код раздела feign.SynchronousMethodHandler, executeAndDecode.

Чтобы исправить это, замените Response.class на желаемый тип в случае правильного ответа с кодом состояния = 2xx (возможно, какой-то класс DTO). Я сделал PR , где для простоты изменил его на String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...