Вад*_*нюк 5 java reactor mongodb project-reactor reactive
我有一个要保存的对象(到 MongoDB),但在此之前我需要检查某些条件是否为真。
对象包含其他对象的 ID。看起来像
"object": {
"id": "123",
"subobject1": { "id": "1" },
"subobject2": { "id": "2" }
}
Run Code Online (Sandbox Code Playgroud)
子对象只包含 id,其他信息位于其他集合中,所以我必须检查信息是否存在。
在块样式中,我可以做类似的事情
if (!languageRepository.exists(Example.of(wordSet.getNativeLanguage())).block()) {
throw new RuntimeException("Native language doesn't exist");
}
if (!languageRepository.exists(Example.of(wordSet.getTargetLanguage())).block()) {
throw new RuntimeException("Target language doesn't exist");
}
Run Code Online (Sandbox Code Playgroud)
只有这样我才能保存我的对象
return wordSetRepository.save(wordSet);
Run Code Online (Sandbox Code Playgroud)
如何在不阻塞的情况下以“反应式”风格做到这一点?
如果您想针对本机与目标语言错误情况传播不同的错误,您需要在 a 中执行异步过滤flatMap:
objectFlux.flatMap(o ->
Mono.just(o)
.filterWhen(languageRepository.exists(...)) //native
.switchIfEmpty(Mono.error(new RuntimeException("Native language doesn't exist"))
.filterWhen(languageRepository.exists(...)) //target
.switchIfEmpty(Mono.error(new RuntimeException("Target language doesn't exist"))
)
.flatMap(wordSetRepository::save);
Run Code Online (Sandbox Code Playgroud)
内部的异步过滤flatMap确保如果测试未通过,则内部序列为空。这反过来又使我们能够检测案例并传播足够的错误。如果两个测试都通过,则原始o序列在主序列中传播。
第二个flatMap从那里获取它,只接收通过两个过滤器的元素并将它们保存在数据库中。
请注意,第一个未通过过滤器的元素将中断整个序列(但在阻塞代码中是相同的,因为抛出了异常)。
| 归档时间: |
|
| 查看次数: |
11759 次 |
| 最近记录: |