【问题标题】:Reactor 3 - How to return Flux on Mono Error?Reactor 3 - 如何在单声道错误时返回通量?
【发布时间】:2019-02-05 15:46:39
【问题描述】:

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

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. 我在方法 1 中尝试过:

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

和上面的代码 sn-p :

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

从不在这里捕获异常。

【问题讨论】:

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


    【解决方案1】:

    你的第一个代码 sn-p 不应该编译,因为方法实现没有重新调整任何东西,所以我会尝试猜测发生了什么。

    这里什么都没有发生,因为该方法没有返回您正在创建的 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 将帮助您在此处将结果转换为预期的返回类型。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多