Zip 2 разных Моно в Spring Webfux

#java #spring-webflux #reactor-netty

#java #spring-webflux #реактор-нетти

Вопрос:

У меня есть следующая функция

 public Mono<CarAndShip> getCarAndShip(Long id) {
    Mono<Car> carMono = carService.getCar(id).subscribeOn(Schedulers.elastic());
    Mono<Ship> shipMono = shipService.getShip(id).subscribeOn(Schedulers.elastic());

    return Mono.zip(carMono, shipMono)
        .flatMap(zipMono -> {
            return new CarAndShip(zipMono.getT1(), zipMono.getT2());
        });
 

IntelliJ жалуется на оператор return, который:

 Required type: Mono <CarAndShip> 
Provided: Mono <Object> no
instance(s) of type variable(s) R exist so that CarAndShip conforms to Mono<? extends R>
 

Как мне ввести приведение к требуемому CarAndShip типу возвращаемого значения?

Комментарии:

1. Как выглядит ваш CarAndShip класс? Почему бы просто не вернуться Mono<Tuple2<Car, Ship>> ?

Ответ №1:

Требуемый тип: Mono Предоставлено: Mono не существует экземпляров переменных типа R, чтобы распределение соответствовало Mono<? расширяет R>

Как указано в исключении: вы не предоставляете Mono.

Так что либо используйте map вместо flatMap :

 return Mono.zip(carMono, shipMono)
    .map(zipMono -> new CarAndShip(zipMono.getT1(), zipMono.getT2()));
 

или предоставить Mono (вероятно, здесь не лучший способ):

 return Mono.zip(carMono, shipMono)
    .flatMap(zipMono -> Mono.just(new CarAndShip(zipMono.getT1(), zipMono.getT2())));
 

Ответ №2:

В этом примере вы должны использовать map() вместо flatMap() , поскольку вы не возвращаете a Mono .