You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Reactive中合并两个Mono生成预期响应?

问题解决方法

你当前的问题是直接将Mono<Book>和Mono<Container>对象赋值给OrderResponse的字段,导致序列化时输出的是Mono类的内部属性(比如scanAvailable),而非包裹的实体数据。要得到目标JSON结构,必须先提取两个Mono中的实际实体对象,再构造OrderResponse。

核心思路

使用Reactor的Mono.zip操作符合并两个Mono,等待两者都完成后获取实际的Book和Container实例,再用这些实例构造OrderResponse。

代码实现示例

假设你的实体类结构如下(需确保字段与目标JSON匹配,必要时用@JsonProperty指定键名):

// Book实体类
public class Book {
    private Integer id;
    private String name;
    private Integer price;
    // 省略getter、setter、构造方法
}

// Container实体类
public class Container {
    private String containerName;
    private String description;
    // 省略getter、setter、构造方法
}

// OrderResponse类,适配目标JSON结构
public class OrderResponse {
    @JsonProperty("Book")
    private Book book;
    @JsonProperty("Container")
    private Container container;
    
    // 构造方法、getter、setter
    public OrderResponse(Book book, Container container) {
        this.book = book;
        this.container = container;
    }
}

修改getProductById方法:

public Mono<OrderResponse> getProductById(Integer id) {
    // 获取Book的Mono
    Mono<Book> bookMono = fetchBookById(id);
    // 获取Container的Mono(假设关联ID为book的id)
    Mono<Container> containerMono = fetchContainerByBookId(id);

    // 合并两个Mono,构造OrderResponse
    return Mono.zip(bookMono, containerMono)
            .map(tuple -> new OrderResponse(tuple.getT1(), tuple.getT2()));
}

说明

  • Mono.zip会等待两个Mono都成功完成,将它们的结果打包为Tuple2对象;
  • map操作中从Tuple2取出实际的Book和Container实例,用这些实例构造OrderResponse;
  • 最终返回的Mono<OrderResponse>序列化后,会输出包含实体数据的JSON结构,即你需要的{"Book": {...}, "Container": {...}}。

内容的提问来源于stack exchange,提问作者Abdullah Imran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:46:00