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)
现在每当下游发生任何错误时,服务器都会响应错误。
我有一个端点采用 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)
现在每当下游发生任何错误时,服务器都会响应错误。