如何捕获MonoError?



我需要捕获MonoError并使用ErrorResponse停止应用程序,但应用程序的工作方式与我预期的不同。

我代码:

return checkText(text)
.then(getWordsFromText(text))
.map(keyWords -> new SuccessfulResponse(keyWords))
.onErrorResume(
throwable -> {
return Mono.just(new ErrorResponse(throwable.getMessage()));
});
public Mono<Void> checkText(String text) {
if (text == null) {
return Mono.error(new Exception("wrong text"));
} 
return Mono.empty();
}

我的问题是如果text参数为null→我落入getWordsFromText方法。这是一个错误的执行,因为如果文本参数等于null,则应用程序必须退出并出现错误(带有ErrorResponse)。

我将其固定为(替换'then')到"flatMap">):

return checkText(text)
.flatMap(voidParam -> getWordsFromText(text)) //replaced 'then' to 'flatMap'
.map(keyWords -> new SuccessfulResponse(keyWords))
.onErrorResume(
throwable -> {
return Mono.just(new ErrorResponse(throwable.getMessage()));
});

,现在它工作正常。如果参数为null我想念调用getWordsFromText方法,并在错误处理(onErrorResume) .

但是我认为在我的情况下使用flatMap不是一个好主意,我不喜欢它的样子:。flatMap (voidParam→…

你有什么办法可以做得更好吗?(没有flatMap)

在第一个代码片段中,对getWordsFromText()的调用是在构建主响应式管道时进行的,甚至在它被订阅之前(即在汇编时)。它在第二个代码片段中工作的原因是,flatMap只在从上游接收元素时(即在订阅时)创建内部发布者(并随后订阅它们)。

在这种情况下,如果您想替换flatMap,您可以尝试:.then(Mono.fromCallable(() -> getWordsFromText(text)))

最新更新