当我的响应被包装在Spring 5的json分页对象中时,如何返回Flux <order>?

时间:2017-06-10 21:20:37

标签: spring spring-boot flux project-reactor spring-webflux

我有一个Web服务,我正在尝试使用新的Spring 5 WebClient。

工作示例

# GET /orders/
[
    { orderId: 1, ... },
    { orderId: 1, ... }
]

调用的java代码

// Java
Flux<Order> ordersStream = webClient.get()
    .uri("/orders/")
    .exchange()
    .flatMap(response -> response.bodyToFlux(Order.class));

问题

来自Web服务的响应是分页的,因此不会直接包含项目列表,如上例所示。

看起来像这样

# GET /orders/
{
    "error": null,
    "metadata": {
      "total": 998,
      "limit": 1000,
      "offset": 0
    },
    "data": [
       { orderId: 1, ... },
       { orderId: 2, ... },
    ]
}

如何将子键"data"作为Flux<Order>

可能的解决方案,但我不知道这是否是最好的方法......

创建一个包装类并将包装器.data转换为通量。

但现在我们需要立即反序列化整个响应,可能会耗尽内存。

// Java
Flux<Order> ordersStream = webClient.get()
    .uri("/orders/")
    .exchange()
    .flatMap(response -> response.bodyToMono(PageWrapper.class))
    .flatMapMany(wrapper -> Flux.fromIterable(wrapper.data));

有更好的方法吗?

0 个答案:

没有答案