Project Reactor条件执行

时间:2018-04-16 15:03:21

标签: java mongodb project-reactor reactive reactor

我有一个保存对象(到MongoDB),但在此之前我需要检查一些条件是否为真。

对象包含其他对象的ID。它看起来像

"object": {
   "id": "123",
   "subobject1": { "id": "1" },
   "subobject2": { "id": "2" }
}

子对象只包含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");
    }

然后才能保存我的对象

return wordSetRepository.save(wordSet);

如何在没有阻止的情况下以“被动”方式进行操作?

1 个答案:

答案 0 :(得分:1)

如果要为本机与目标语言错误情况传播不同的错误,则需要在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);

flatMap内的异步过滤确保如果测试没有通过,则内部序列为空。这反过来允许我们检测案例并传播适当的错误。如果两个测试都通过,则原始o将在主序列中传播。

第二个flatMap从那里获取它,只接收通过两个过滤器的元素并将它们保存在DB中。

请注意,未通过过滤器的第一个元素将中断整个序列(但是由于抛出了异常,因此在阻塞代码中它是相同的。)