如何处理 Spring 反应器中的空事件

How to handle empty event in Spring reactor

嗯,这听起来与什么是反应式编程有悖常理,但我无法理解处理 nulls/exceptions 的方法。

private static class Data {
    public Mono<String> first() {
        return Mono.just("first");
    }
    public Mono<String> second() {
        return Mono.just("second");
    }

    public Mono<String> empty() {
        return Mono.empty();
    }
}

我理解基本上除非发布者发布事件,否则订阅者不会采取行动。所以像这样的代码可以工作。

Data data = new Data();
data.first()
    .subscribe(string -> Assertions.assertThat(string).isEqualTo("first"));

如果第一个调用 return 是空的,我可以这样做。

Data data = new Data();
data.empty()
    .switchIfEmpty(data.second())
    .subscribe(string -> Assertions.assertThat(string).isEqualTo("second"));

但是我该如何处理两个调用 return 都为空的情况(通常这是需要传播给用户的异常情况)。

Data data = new Data();
data.empty()
    .switchIfEmpty(data.empty())
    .handle((string, sink) -> Objects.requireNonNull(string))
    .block();

在上面的例子中没有调用句柄,因为没有发布事件。

正如 JB Nizet 指出的那样,您可以在一秒钟内将 switchIfEmptyMono.error 链接起来。

或者,如果您不介意 NoSuchElementException,您可以链接 single()。它强制执行 恰好一个 元素的强契约,否则传播该标准异常。