Feign Client Обработка ошибок - подавление ошибок / исключений и преобразование в 200 успешных ответов - PullRequest
1 голос
/ 16 мая 2019

Я использую симулированный клиент для подключения к нисходящему сервису.

Я получил требование, что когда одна из конечных точек нисходящего сервиса возвращает 400 (это сценарий частичного успеха), нашему сервису необходимо преобразовать его в 200 успехов со значением ответа.

Я ищудля лучшего способа сделать это.

Мы используем декодер ошибок для обработки ошибок, и приведенное выше преобразование применимо только для одной конечной точки, а не для всех конечных точек нисходящего потока, и заметил, что метод decode () должен возвращать исключение обратно.

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Еще один способ сделать это - создать пользовательское исключение в декодере ошибок и преобразовать это пользовательское исключение в успех в глобальном обработчике исключений Spring (используя @RestControllerAdvice)

public class CustomErrorDecoder implements ErrorDecoder {

@Override
public Exception decode(String methodKey, Response response) {

    if (response.status() == 400 && response.request().url().contains("/wanttocovert400to200/clientendpoints") {
        ResponseData responseData;
        ObjectMapper mapper = new ObjectMapper();
        try {
            responseData = mapper.readValue(response.body().asInputStream(), ResponseData.class);
        } catch (Exception e) {
            responseData = new ResponseData();
        }
        return new PartialSuccessException(responseData); 
    }
    return FeignException.errorStatus(methodKey, response);
}}

И обработчик исключений, как показано ниже

@RestControllerAdvice
public class GlobalControllerExceptionHandler {

    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(PartialSuccessException.class)
    public ResponseData handlePartialSuccessException(
            PartialSuccessException ex) {
        return ex.getResponseData();
    }
}
0 голосов
/ 20 мая 2019

Вам нужно будет создать настроенный Client для перехвата Response достаточно рано, чтобы изменить статус ответа и не вызывать ErrorDecoder. Самый простой подход - создать оболочку на существующем клиенте и создать новый Response со статусом 200. Вот пример использования Feign's ApacheHttpClient:

public class ClientWrapper extends ApacheHttpClient {
   private ApacheHttpClient delegate;

   public ClientWrapper(ApacheHttpClient client) {
      this.client = client;
   }

   @Override
   public Response execute(Request request, Request.Options options) throws IOException {
      /* execute the request on the delegate */
      Response response = this.client.execute(request, options);

      /* check the response code and change */
      if (response.status() == 400) {
         response = Response.builder(response).status(200).build();
      }
      return response;
   }
}

Этот настроенный клиент может использоваться на любом клиенте Feign, который вам нужен.

...