Spring Feign обработки исключений клиента - PullRequest
0 голосов
/ 06 марта 2019

У меня есть клиент для отправки запроса в другой микро сервис.

@FeignClient(name="userservice")
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}

Теперь я отправляю запрос вот так

try {
    String responseData = userClient.getUserByid(id);
    return responseData;
    }

catch(FeignException e)
 {
 logger.error("Failed to get user", id);
}

catch (Exception e) 
{
 logger.error("Failed to get user", id);
}

Здесь проблема в том, что если возникает какое-либо исключение FeignException, я не получаю код ошибки.

Мне нужно отправитьсоответствующие коды ошибок в других APIS для отправки вызывающему абоненту

Так как извлечь код ошибки?Я хочу извлечь код ошибки и создать responseEntity

Я получил этот код, но не знаю, как именно я могу использовать в своей функции.

Ответы [ 2 ]

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

Не та проблема, но это помогло в моей ситуации.FeignException OpenFeign не привязывается к определенному HTTP-состоянию (то есть не использует аннотацию Spring @ResponseStatus), что делает Spring по умолчанию равным 500, когда сталкивается с FeignExceptionЭто нормально, потому что FeignException может иметь множество причин, которые не могут быть связаны с определенным статусом HTTP.

Однако вы можете изменить способ, которым Spring обрабатывает исключения FeignException.Просто определите ExceptionHandler, который обрабатывает FeignException

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(FeignException.class)
    public String handleFeignStatusException(FeignException e, HttpServletResponse response) {
        response.setStatus(e.status());
        return "feignError";
    }

}

В этом примере Spring возвращает тот же HTTP-статус, который вы получили

0 голосов
/ 07 марта 2019

Вы пытались внедрить FallbackFactory на своем симулированном клиенте?

https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#spring-cloud-feign-hystrix-fallback

В методе создания перед возвратом вы можете получить код состояния http с помощью этого фрагмента:

String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

Пример:

@FeignClient(name="userservice", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @RequestMapping(
            method= RequestMethod.GET,
                      path = "/userlist")
    String getUserByid(@RequestParam(value ="id") String id);

}


@Component
static class UserClientFallbackFactory implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable cause) {

     String httpStatus = cause instanceof FeignException ? Integer.toString(((FeignException) cause).status()) : "";

     return new UserClient() {
        @Override
        public String getUserByid() {
            logger.error(httpStatus);
            // what you want to answer back (logger, exception catch by a ControllerAdvice, etc)
        }
    };
}

}

...