Spring Webflux Mono <Void>всегда отвечает успешным ответом - PullRequest
0 голосов
/ 18 июня 2020

У меня есть конечная точка, которая принимает параметр id и отправляет api продукта для удаления. productService.delete также возвращает Mono. Проблема в том, что когда метод productService.delete возвращает моно-ошибку, конечная точка всегда отвечает http 200. И я могу видеть журнал ошибок об этой моно-ошибке, но мой метод обработчика отвечает http 200.

У меня есть AbstractErrorWebExceptionHandler для обработчика исключение в моем api. Но обработчик ошибок не может справиться с этой проблемой из-за Mono. Когда в нисходящем потоке возникают исключения, Spring webflux должен знать об этой ошибке и не отвечает HTTP 200.

    public Mono<ServerResponse> deleteProduct(ServerRequest request) {
     String id = request.pathVariable("id");
     Mono<Product> productMono = this.repository.findById(id);
     return productMono
            .flatMap(existingProduct ->
                    ServerResponse.noContent()
                            .build(productService.delete(existingProduct))
            );
}

Кстати, в исходном коде говорится, что ответ будет зафиксирован, когда данный издатель завершит работу. Но как насчет полной ошибки? Я думаю, что Spring webflux не проверяет, является ли это сигналом ошибки или нет. Просто проверьте, завершается ли моно или нет.

     * Build the response entity with no body.
     * The response will be committed when the given {@code voidPublisher} completes.
     * @param voidPublisher publisher publisher to indicate when the response should be committed
     * @return the built response
     */
    Mono<ServerResponse> build(Publisher<Void> voidPublisher);

Заранее благодарю

1 Ответ

0 голосов
/ 18 июня 2020

Проблема вызвана использованием voidPublisher. Если вы создаете ServerResponse с void publisher, он просто вернет http 200, даже если ваш нисходящий поток завершен с сигналом ошибки. Его просто не волнует, как закончится ваш поток sh, он просто заботится о завершении нисходящего потока.

И если вы хотите обрабатывать ошибку в нисходящем направлении, когда вы создаете свой ответ, просто используйте

 ServerResponse.noContent()
    .body(productService.delete(existingProduct), Void.class)

Теперь всякий раз, когда возникает какая-либо ошибка в нисходящем направлении, сервер будет отвечать с ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...