Reactor 3 - 如何在Mono Error上返回Flux?

问题描述 投票:2回答:2

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

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。否则返回空的Flux。

需要注意的指针是 -

  1. 它没有达到第二个方法调用
  2. 由于一种方法是Mono而另一种方法是Flux,如果我直接在第2行添加返回,则存在类型不匹配。
  3. 我在方法1中试过这个: if(Object1.id().isEmpty()){ throw new IllegalArgumentException; }

并在上面的代码片段中:

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

永远不会在这里遇到异常。

spring-boot reactive-programming spring-webflux project-reactor reactor
2个回答
2
投票

你的第一个代码片段不应该编译,因为方法实现没有返回任何东西,所以我会试着猜测发生了什么。

此处没有任何操作,因为该方法不会返回您正在创建的Publisher。 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
投票

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

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

而是返回一个Flux。即使只返回1个数据,也可以作为Flux返回。将Mono转换为Flux,如果它将用户switchIfEmpty运算符清空,则发送不同的Flux Stream。

© www.soinside.com 2019 - 2024. All rights reserved.