Заархивируйте 2 разных Mono в Spring Webfux

У меня есть функция ниже

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?


person hydradon    schedule 19.01.2021    source источник
comment
Как выглядит ваш CarAndShip класс? Почему бы просто не вернуть Mono<Tuple2<Car, Ship>>?   -  person xtratic    schedule 19.01.2021


Ответы (2)


Требуемый тип: Mono Предоставлено: Mono нет экземпляров переменной (ов) типа R, так что CarAndShip соответствует 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())));
person Puce    schedule 19.01.2021

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

person Michael McFadyen    schedule 19.01.2021