Является ли объявление throws в симуляционном клиенте бесполезным без определенного декодера ошибок? - PullRequest
1 голос
/ 05 мая 2020

У меня есть фальшивый клиент, подобный этому

@FeignClient(name = "client")
public interface SomeClient {
    @RequestLine("GET /?q={q}")
    void execute(URI baseUrl, @Param("q") String q) throws SomeExceptionInMyCode;
}

Глядя на это throws SomeExceptionInMyCode Я спрашиваю себя, когда будет создано это исключение. Нет конфигурации для определенного клиента, нет декодера ошибок. Исключение выглядит так.

public class SomeExceptionInMyCode extends Exception{

    private final int statusCode;
    private final String reason;
    private final String body;

    // getters and setters
}

Будет ли автоматическая c попытка декодировать HTTP-ответ на это исключение в случае сбоя? Или throws SomeExceptionInMyCode бесполезен и может быть удален без каких-либо последствий.

Я искал внутри своего кода, и это исключение никогда не создается.

1 Ответ

2 голосов
/ 06 мая 2020

Будет ли автоматическая c попытка декодировать HTTP-ответ на это исключение в случае сбоя?

Нет, так не работает и SomeExceptionMyCode не будет выброшено. Предложение throws бесполезно. Даже если конечная точка выдает это исключение из своей реализации, оно будет обернуто как причина FeignException.

Правильный способ обработки ложных клиентских исключений - использование Пользовательская обработка исключений реализация ErrorDecoder:

public class StashErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() >= 400 && response.status() <= 499) {
            // return 4XX exception
        }
        if (response.status() >= 500 && response.status() <= 599) {
            // return 5XX exception
        }
    }
}

На этом этапе вы можете выполнить создание и повторное создание настраиваемого исключения.

Альтернативным решением является использование Spring-подобного @RestControllerAdvice:

@RestControllerAdvice
public class ExceptionHandler {

    @ExceptionHandler(FeignException.class)
    public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
        // ...
    }

}
...