当前位置: 首页 > 知识库问答 >
问题:

Spring Webflux:处理单声道中一个单声道为空时的错误。拉链

祁绪
2023-03-14

我的代码如下

public Mono<Ship> getShip() { 
    //... 
}

public Mono<Car> getCar() { 
    //... 
}

public Mono<ShipAndCar> getCombinedMono() {
    Mono<Ship> shipMono = getShip();
    Mono<Car> carMono = getCar();

    return Mono.zip(shipMono, carMono
                    (ship, car) -> return new ShipAndCar(ship, car);

}

因为getShipgetCar都可能返回错误或空单声道。我想返回类似于Mono的内容。错误(新异常(“自定义消息”)消息取决于哪个Mono是空的。我该怎么做?

如果我在单声道之后添加一个开关ifempty。zip,我不知道哪个组件是空的。。。

共有2个答案

姬裕
2023-03-14

您可以使用映射到可选的帮助器方法,将当值丢失时要做什么的决定推迟给以后的使用者。

例如,如果您只想默认丢失的发货,但在丢失的汽车上出现错误

package com.example.demo;

import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import java.util.Optional;

public class JavaTest {

    @Test
    public void nullCarProducesSpecificException() {
        Mono<Ship> shipMono = Mono.empty();
        Mono<Car> carMono = Mono.empty();

        Mono<ShipAndCar> map = Mono.zip(
            shipMono.transform(JavaTest::toOptional),
            carMono.transform(JavaTest::toOptional))
            .map(tuple -> new ShipAndCar(
                tuple.getT1().orElse(new Ship("US Default")),
                tuple.getT2().orElseThrow(() -> new RuntimeException("Car was missing!!")))
            );

        StepVerifier.create(map)
            .verifyErrorMatches(error ->
                error instanceof RuntimeException &&
                    "Car was missing!!".equals(error.getMessage())
            );

    }

    private static <T> Mono<Optional<T>> toOptional(Mono<T> mono) {
        return mono.map(Optional::of)
            .defaultIfEmpty(Optional.empty());
    }
}

马哲
2023-03-14

如果你在代码中压缩它们,你可以用像这样的开关空运算符扩展每个输入单声道

java prettyprint-override">        var carAndShip = Mono.zip(
                Optional.ofNullable(shipMono)
                        .orElseThrow(() -> new RuntimeException("ship is null"))
                        .switchIfEmpty(Mono.error(new RuntimeException("ship is empty"))),
                Optional.ofNullable(carMono)
                        .orElseThrow(() -> new RuntimeException("car is null"))
                        .switchIfEmpty(Mono.error(new RuntimeException("car is empty"))),
                ShipAndCar::new
        );


 类似资料:
  • 我的理解是单声道 我说得对吗? 如果没有,单声道之间的区别是什么

  • 我最近一直在学习使用Java中的reactor库和Spring框架进行反应式编程,并且在很大程度上我已经能够掌握它。然而,我发现自己有好几次遇到同样的情况,我想知道我哪里出了问题。 我正在努力解决的问题的要点是,我经常想用mono做一些事情,比如找到一些补充数据,然后将其添加回原始mono中。zip函数在我看来是一个理想的候选函数,但最终我订阅了两次原始mono,这不是我的意图。 这里有一个人为的

  • 我注意到使用Reactor时的一些奇怪行为。场景是这样的: 调用rest APIendpoint,获取一个值,封装在Mono中 使用上述值调用另一个rest APIendpoint,检索另一个值,用Mono封装 压缩这两个结果 出现的情况是,onSubscribe(FluxMap.MapSubscriber)在第一个API调用中被调用两次,然后打开两个连接并生成两个结果。传递给第二个API调用的结

  • 我面临的情况是,我必须使用2 Mono,其中第二个将依赖于第一个的Id字段,并在第一个Mono的主体中返回第二个的响应。 例如: 然后将结果返回为 我试过了 但像这样,我只能返回第二个单声道的响应。 通过尝试Map或Flatmap,它只在第二个单声道上起作用。 请提出建议。

  • 给定以下monos: 双: 和: 具有相同的输出: 和之间有什么区别,在这种情况下? 从https://projectreactor.io/docs/core/release/reference/index.html#which-operator: [如果你]有一个序列,但[你]对值不感兴趣,并且[你]想在最后切换到另一个单声道,[使用]。 [如果您]希望通过将发布者从1个Mono和任何源端协调到

  • 我有一个服务电话返回单声道。现在,在给用户提供API响应的同时,我想发送一些响应。我试过用flatMap和地图,但它不起作用。它给了我一个空的身体作为回应。 谢谢你