Общий подход к обработке времени ожидания и других исключений ввода-вывода с Spring Rest Template - PullRequest
0 голосов
/ 24 января 2020

Проблема

У меня есть около 40 методов, которые используют RestTemplate для выполнения HTTP-вызовов. На данный момент я решил создать обработчик ошибок, который будет сопоставлять RestTemplateException с моим собственным исключением (например, MyApplicationRestException).

Рассмотренные подходы

  1. Оберните все вызовы с помощью try / catch

    1.1 Недостаток: следует обновить все 40 методов. Легко забыть те, которые пытаются / поймать в новых методах

  2. org.springframework.web.client.ResponseErrorHandler

    2.1 Недостаток: по какой-то причине он перехватывает только исключения, которые имеют statusCode ! = ноль. Поэтому он не может обрабатывать тайм-ауты.

  3. Ввести новый аспект, который будет перехватывать все исключения RestTemplateException и обрабатывать их должным образом. Он устраняет все недостатки предыдущих решений, но я всегда реализую аспекты как последний выбор.

Есть ли лучшие решения?

1 Ответ

0 голосов
/ 28 января 2020

Наконец-то я придумал аспект:

@Aspect
@Component
public class RestCallsExceptionHandlingAspect {

    @AfterThrowing(pointcut = "execution(* eu.mypackage.RestClient.*(..))", throwing = "e")
    public void handle(Exception e) throws Throwable  {
        if (e instanceof RestClientException) {
            if (e instanceof HttpStatusCodeException) {
                if (((HttpStatusCodeException)e).getStatusCode().is4xxClientError()) {
                    throw new TranslatableException(e, ValidationErrorGroup.COMMUNICATION_ERROR, CommonErrorCode.CLIENT_ERROR.name());
                } else {
                    throw new TranslatableException(e, ValidationErrorGroup.COMMUNICATION_ERROR, CommonErrorCode.SERVER_ERROR.name());
                }
            } else {
                throw new TranslatableException(e, ValidationErrorGroup.COMMUNICATION_ERROR, CommonErrorCode.CORE_IO_ERROR.name());
            }
        }
        throw e;
    }
}
...