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

Leo*_*ley 5 spring flux spring-boot project-reactor spring-webflux

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

\n\n

工作示例

\n\n
# GET /orders/\n[\n    { orderId: 1, ...\xc2\xa0},\n    { orderId: 1, ...\xc2\xa0}\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及调用的java代码

\n\n
// Java\nFlux<Order> ordersStream = webClient.get()\n    .uri("/orders/")\n    .exchange()\n    .flatMap(response -> response.bodyToFlux(Order.class));\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题

\n\n

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

\n\n

看起来像这样

\n\n
# GET /orders/\n{\n    "error": null,\n    "metadata": {\n      "total": 998,\n      "limit": 1000,\n      "offset": 0\n    },\n    "data": [\n       { orderId: 1, ... },\n       { orderId: 2, ... },\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我怎样才能获得子"data"密钥Flux<Order>

\n\n

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

\n\n

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

\n\n

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

\n\n
// Java\nFlux<Order> ordersStream = webClient.get()\n    .uri("/orders/")\n    .exchange()\n    .flatMap(response -> response.bodyToMono(PageWrapper.class))\n    .flatMapMany(wrapper -> Flux.fromIterable(wrapper.data));\n
Run Code Online (Sandbox Code Playgroud)\n\n

有没有更好的办法?

\n