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

时间:2018-03-04 07:55:39

标签: spring project-reactor

嗯,这听起来与反应式编程相反,但是我无法理解处理空值/异常的方法。

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"));

如果第一个呼叫返回空,我可以这样做。

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

但是当两个调用都返回空时(如果这是一个需要传播给用户的异常情况),我该如何处理一个案例。

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

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

1 个答案:

答案 0 :(得分:1)

正如JB Nizet指出的那样,你可以用switchIfEmpty链接一秒Mono.error

或者,如果您对NoSuchElementException感到满意,可以链接到single()。它强制执行完全一个元素的强大契约,否则传播该标准异常。