Reactor 3-如何在发生Mono错误时返回磁通量?

时间:2018-08-30 16:10:49

标签: spring-boot reactive-programming spring-webflux project-reactor reactor

这是样板代码:我想做这样的事情-

public Flux<Object2> getSomething(String email) {
    method1(email).map(result -> {  //method1 returns Mono<Object1>
        if(result.id().isEmpty()) {
            return method2(email); //method2 returns Flux<Object2>
        } else {
            return Flux.empty();
        }
    };
});

因此,当method1返回空的Object1.id()时,则仅调用method2。否则返回空的助焊剂。

要注意的指针是-

  1. 它没有到达第二个方法调用

  2. 由于一种方法是Mono,另一种方法是Flux,所以如果我直接在第2行中添加return,则类型不匹配。

  3. 我在method1中尝试过此方法:

    if(Object1.id().isEmpty()){
    
       throw new IllegalArgumentException;
    }
    

以及上面的代码片段:

try {
    method1(email);
} catch(IllegalArgumentException e) {
    return method2(email);
}

从不捕获异常。

2 个答案:

答案 0 :(得分:2)

您的第一个代码段不应编译,因为该方法的实现未调整任何内容,因此,我将尝试猜测发生了什么。

这里什么也没有发生,因为该方法未返回您正在创建的发布者。 If nothing subscribes to that Flux/Mono, nothing happens

public Flux<Object2> getSomething(String email) {
    return method1(email)
              .filter(result -> result.id().isEmpty())
              .flatMapMany(result -> method2(email));
}

然后,如果不满足谓词,则可以使用filter过滤出结果,并且不从该Mono中发出任何内容。另外,flatMapMany将帮助您在此处将结果转换为预期的回报类型。

答案 1 :(得分:1)

您应该使用switchIfEmpty()运算符。

此外,如果要从方法中返回两种类型(Mono以及Flux),则将返回类型更改为org.reactiveStreams.Publisher。我不会推荐这个。

返回磁通量。即使仅返回1个数据,也可以将其作为Flux返回。 将Mono转换为Flux,如果用户为空,则将其转换为switchIfEmpty运算符,以发送不同的Flux流。