Использование декларативных клиентских исключений всегда выдает 500 из контроллера - PullRequest
1 голос
/ 10 апреля 2019

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

@Controller("/order-gateway/orders")
public class OrderController {
    private final OrderClient client;

    public OrderController(OrderClient client) {
        this.client = client;
    }

    @Post
    @Produces(MediaType.TEXT_PLAIN)
    public Single<String> createOrder() {
        return client.createOrder();
    }
}

Все вышеперечисленное - просто пример кода, но когда клиент вызываетконечная точка службы, она не авторизована и возвращает 401. Но мой контроллер выше возвращает 500, потому что client.createOrder() выдает исключение из получения 401.

Я вроде бы ожидал, что смогу обработатьэто, но я попробовал doOnErrors и другие методы, которые, кажется, не мешают 500. Во всяком случае, я бы хотел взорвать 401 или, по крайней мере, обработать 500 изящнее.Но я даже не знаю, как получить код состояния вызова службы из асинхронного ответа.

1 Ответ

2 голосов
/ 11 апреля 2019

Так что, скорее всего, то, что вы ищете:

    @Post
    @Produces(MediaType.TEXT_PLAIN)
    Single<MutableHttpResponse<String>> createOrder() {
        return client.createOrder()
                .map(HttpResponse::ok)
                .onErrorReturn(t -> {
                    HttpClientResponseException exception = (HttpClientResponseException) t;
                    return HttpResponse.status(exception.getStatus());
                });
    }

Для того, чтобы распространить статус ответа, вы должны вернуть HTTP-ответ, а не просто тело издателя.Это требует от вас сопоставления клиентского вызова с ответом в случае успеха.В приведенном выше примере я также использую onErrorReturn для возврата ответа в случае ошибки.

...