我有一个使用 Spring 和相关库(包括 Reactor)用 Java 编写的 REST 服务,使用 Mono 来包装昂贵的操作。
我正在使用常用的 CRUD 方法重构数据库相关代码。我遇到过返回类型为
Mono<Void>
的示例,对我来说,这对于只关心成功或失败的方法是有意义的。对于我的用例,例如更新或特别删除数据库条目。
实际上,我在尝试使用
Mono<Void>
时遇到了各种各样的摩擦,当我有一个区域有两种可以并行完成的方法时,这对我来说是一个紧要关头,其中一个方法是返回 Mono<Void>
,当我使用 Mono.zip
来组合结果时,结果不起作用。我找不到任何方法来组合它们,保持并行性,并使用Mono<Void>
。有效的方法是将 Mono<Void>
映射到带有虚拟 Mono<Boolean>
的 Boolean.TRUE
之类的东西。
所以此时我想知道当方法没有真正的返回类型,仅指示成功或错误时,最佳实践是什么。我应该尝试将
Mono<Void>
与我缺少的一些技术一起使用,还是只使用像 Mono<Boolean>
这样的虚拟类型?
当我去使用 Mono.zip 来合并不起作用的结果时
那是因为你不能将某些东西压缩为空,生成的单声道将是空的。
相反,您可以使用 (1)
Flux.merge
并调用 next
将 Flux 转换为 Mono 或 (2) 或让 mono void 完成然后播放另一个。
Mono<Void> monoVoid = Mono.empty();
Mono<Object> monoSomething = Mono.just("something");
StepVerifier.create(Mono.zip(monoVoid, monoSomething))
.expectNextCount(0) // Note: zip results in empty mono
.expectComplete()
.verify();
// Alternative #1
StepVerifier.create(Flux.merge(monoVoid, monoSomething).next())
.expectNext("something")
.expectComplete()
.verify();
// Alternative #2
StepVerifier.create(monoVoid.then(monoSomething))
.expectNext("something")
.expectComplete()
.verify();