Использование декларативных исключений клиента всегда выдает 500 из контроллера

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

@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 изящно. Но я даже не знаю, как получить код состояния вызова службы из асинхронного ответа.


person Gregg    schedule 10.04.2019    source источник


Ответы (1)


Вероятно, вы ищете что-то вроде этого:

    @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 для возврата ответа в случае ошибки.

person James Kleeh    schedule 11.04.2019
comment
Потрясающие. Хорошо, я пытался добраться до этого; Я предположил, что это было решение. Спасибо! Я попробую немного и доложу. - person Gregg; 11.04.2019
comment
ИДЕАЛЬНО! Спасибо еще раз. - person Gregg; 11.04.2019