使用 Spring Webflux 返回元素列表
Posted
技术标签:
【中文标题】使用 Spring Webflux 返回元素列表【英文标题】:Returning list of elements with Spring Webflux 【发布时间】:2017-10-31 02:45:12 【问题描述】:我正在尝试使用 Spring Webflux 创建一个简单的 CRUD 示例,但我在某些概念上卡住。
我知道我可以在我的控制器请求映射方法中返回一个 Flux。但有时我想返回一个 404 状态,所以我可以在前端以某种方式处理。
我在official documentation 中找到了一个使用ServerResponse 对象的示例:
public Mono<ServerResponse> listPeople(ServerRequest request)
Flux<Person> people = repository.allPeople();
return ServerResponse.ok().contentType(APPLICATION_JSON).body(people, Person.class);
如您所见,即使返回的是列表 (Flux) o persons,ServerResponse.ok.body 也会创建一个 Mono。
所以我的问题是:是这样吗?换句话说,我有没有 Flux 没关系,Spring 是否总是返回一个 Mono 的 ServerResponse(或其他类似的类)?
对于我的 404 状态,我可以使用类似的东西
.switchIfEmpty(ServerResponse.notFound().build());
但我在考虑更多流媒体的方式。例如,我可以逐个元素地处理对象列表。
【问题讨论】:
ServerResponse
始终是单个元素,因此是单声道,ServerResponse
内部返回的内容可能是通量,这也是应该发生的。
@M.Deinum,感谢您的回答。但我不知道如何返回一些 http 状态。每个示例都使用 @GetMapping("/person") FluxFlux<ResponseEntity<Person>>
吗?
【参考方案1】:
我认为您需要函数collectList()
和flatMap()
。
像这样:
public Mono<ServerResponse> listPeople(ServerRequest request)
Flux<Person> people = repository.allPeople();
return people.collectList().flatMap(p->
p.size() < 1 ?
ServerResponse.status(404).build()
:ServerResponse.ok().contentType(APPLICATION_JSON).body(fromObject(p))
);
【讨论】:
以上是关于使用 Spring Webflux 返回元素列表的主要内容,如果未能解决你的问题,请参考以下文章
spring5 webflux,如何返回自定义json数据?
技术使用 Spring 5 的 WebFlux 开发反应式 Web 应用