Spring Boot 如何在java reactive中合并两个不同的Mono以产生最终响应

xmd2e60i  于 2022-12-29  发布在  Spring
关注(0)|答案(1)|浏览(582)

在getProductById方法中,我尝试从Mono<Book>Mono<Container>构造Mono<OrderResponse>,如下所示。问题是该方法返回的响应结构与我应该得到的不同。

public Mono<OrderResponse> getProductById(Integer id) {

        Mono<Book> monoBook=Mono.just(id).
            flatMap(ops.service(BookingDomainService.class)::getProductById);

        Mono<Container> monoCon=Mono.just(id).
            flatMap(ops.service(BookingDomainService.class)::getContainerById);

        OrderResponse or=new OrderResponse(monoBook,monoCon);
        return Mono.just(or);
    }

BOOK、Container和Response类的结构如下所示。
x一个一个一个一个x一个一个二个一个x一个一个三个一个
方法getProductById(Integer id)形成的最终响应为

{
    "orderMono": {
        "scanAvailable": true
    },
    "orderContainerMono": {
        "scanAvailable": true
    }
}

但我需要最后的答复:
我需要最后的回应,如下面的JSON。如何实现它。

Response:
{
  "Book": {
    "id": 12,
    "name": "pn",
    "price": 128
  },
  "Container": {
    "containerName": " Cname",
    "description": "diesc"
  }
}
uurity8g

uurity8g1#

您可以使用Mono.zip将多个Mono的结果聚合到一个单一的结果中,当所有给定的Mono都生成了一个项目时,该结果将得到满足。

public final class OrderResponse {
    private final Book book;
    private final Container container;

    public OrderResponse(Book book, Container container) {
        this.book = book;
        this.container = container;
    }

    // ...
}

public Mono<OrderResponse> getProductById(Integer id) {
    // replace these lines with your actual calls
    Mono<Book> bookMono = Mono.just(new Book(1, "Book 1", 1L));
    Mono<Container> containerMono = Mono.just(new Container("A", "B"));

    return Mono.zip(bookMono, containerMono)
            .map(tuple -> new OrderResponse(tuple.getT1(), tuple.getT2()));
}

如果希望直接返回OrderResponse对象,而不是将其 Package 在Mono中,则可以 checkout Mono#block方法。

相关问题