Spring Webflux Mono<Void> 始终响应成功

Spring Webflux Mono<Void> always responds with successful response

我有一个端点采用 id 参数并发送删除产品 api 进行删除。 productService.delete 也 returns 单声道。问题是当 productService.delete 方法 returns 单声道错误时,端点总是用 http 200 响应。我可以看到关于这个单声道错误的错误日志,但我的处理程序方法响应 http 200。

我的 api 中有一个 AbstractErrorWebExceptionHandler 来处理异常。但是由于 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))
            );
}

顺便说一句,在源代码中,它表示响应将在给定的发布者完成时提交。但是 error complete 怎么样?我认为 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);

提前致谢。

问题是使用voidPublisher引起的。如果您使用 void publisher 创建 ServerResponse,它只会 return http 200 甚至您的下游完成并带有错误信号。它只是不关心你的流如何完成,它只关心下游的完成。

如果您想在构建响应时处理下游错误,只需简单地使用

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

现在每当下游发生任何错误时,服务器都会响应错误。