【问题标题】:How can catch MonoError?如何捕获 MonoError?
【发布时间】:2021-12-11 18:33:33
【问题描述】:

我需要捕获 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 方法。这是不正确的执行,因为如果 text 参数等于 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()));
                        });

现在它可以正常工作了。如果 text 参数为 null,我会错过调用 getWordsFromText 方法并陷入错误处理 (onErrorResume)。 p>

但我认为在我的情况下使用 flatMap 不是一个好主意,我不喜欢它的外观:.flatMap(voidParam -> ...

您有什么想法可以做得更好吗? (没有'flatMap')

【问题讨论】:

标签: java try-catch spring-webflux flux reactor


【解决方案1】:

在第一个 sn-p 中,对 getWordsFromText() 的调用是在构建主反应管道时进行的,甚至在它被订阅之前(即在组装时)。它在第二个 sn-p 中按预期工作的原因是 flatMap 仅在从上游接收元素时(即在订阅时)创建内部发布者(并随后订阅它们)。

在这种情况下,如果你想替换 flatMap,你可以试试这个:.then(Mono.fromCallable(() -&gt; getWordsFromText(text)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 2012-03-27
    • 2014-12-10
    • 1970-01-01
    • 2017-10-06
    • 2021-06-15
    • 2017-08-19
    • 1970-01-01
    相关资源
    最近更新 更多