3

我有一个 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));

有没有更好的办法?

4

0 回答 0