如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?
Posted
技术标签:
【中文标题】如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?【英文标题】:How can I return a Mono<Map<String, Flux<Integer>>> response in Spring Webflux? 【发布时间】:2018-12-19 16:49:51 【问题描述】:所以现在,我返回的响应看起来像
@GetMapping("/integers")
@ResponseStatus(code = HttpStatus.OK)
public Mono<Map<String, Flux<Integer>>> getIntegers()
Mono<Map<String, Flux<Integer>>> integers =
Mono.just(Map.of("Integers", integerService.getIntegers()));
return integers;
这给了我一个回应
"Integers":"scanAvailable":true,"prefetch":-1
我希望它也能流式传输Flux<Integer>
部分,但它没有。我将如何在 Spring webflux 中执行此操作?
【问题讨论】:
【参考方案1】:Spring WebFlux 只能处理一种响应式类型,而不会处理嵌套的响应式类型(例如 Mono<Flux<Integer>>
)。你的控制器方法可以返回一个Mono<Something>
、一个Flux<Something>
、一个ResponseEntity<Mono<Something>>
、一个Mono<ResponseEntity<Something>>
等——但不能嵌套反应类型。
您在响应中看到的奇怪数据是 Jackson 实际上试图序列化一个反应类型(因此您看到的是数据的承诺,而不是数据本身)。
在这种情况下,您可以像这样重写您的方法:
@GetMapping("/integers")
@ResponseStatus(code = HttpStatus.OK)
public Mono<Map<String, Flux<Integer>>> getIntegers()
Flux<Integer> integers = integerService.getIntegers();
Mono<Map<String, List<Integer>>> result = integers
// this will buffer and collect all integers in a Mono<List<Integer>>
.collectList()
// we can then map that and wrap it into a Map
.map(list -> Collections.singletonMap("Integers", list));
return result;
您可以在the Spring WebFlux reference documentation 中阅读有关支持的返回值的更多信息。
【讨论】:
我明白了,我最终链接了@Getmapping 来生成 MediaType.APPLICATION_STREAM_JSON_VALUE 因为我不确定返回纯 FluxFlux.collectList
确实缓冲内存中的所有内容,因此这不是大型集合/对象的最佳选择。
呵呵,好吧,我注意到你在 SO 上提出了很多与 spring webflux 相关的问题,所以你的手现在一定是击键快乐这有道理,谢谢!
对我非常有用,谢谢以上是关于如何在 Spring Webflux 中返回 Mono<Map<String, Flux<Integer>>> 响应?的主要内容,如果未能解决你的问题,请参考以下文章
如何在错误 Spring WebFlux 上调用另一个 api