如何处理 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 指出的那样,您可以在一秒钟内将 switchIfEmpty
与 Mono.error
链接起来。
或者,如果您不介意 NoSuchElementException
,您可以链接 single()
。它强制执行 恰好一个 元素的强契约,否则传播该标准异常。
嗯,这听起来与什么是反应式编程有悖常理,但我无法理解处理 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 指出的那样,您可以在一秒钟内将 switchIfEmpty
与 Mono.error
链接起来。
或者,如果您不介意 NoSuchElementException
,您可以链接 single()
。它强制执行 恰好一个 元素的强契约,否则传播该标准异常。