如何在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
相关产品推荐
相关产品推荐

