使用 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") Flux list() return this.repository.findAll(); 而不是通常的 ResponseEntity 对象,它可能包含一个状态。 @IgorVeloso 您的最新评论表明您正在使用 WebFlux 注释模型,但您的问题暗示了功能模型。您能否编辑您的问题以解释您想要实现的目标? @BrianClozel,这是真正的问题,在我的问题中,我使用了官方 Spring 文档中的示例,但我想返回一个 Http 状态(比如说 404)。在我的评论中,我刚刚写了另一个我在网上找到的例子,但也没有 http 状态。抱歉,如果我不清楚,但正如我所说,也许我被一些核心概念所困。 @IgorVeloso 你要返回Flux&lt;ResponseEntity&lt;Person&gt;&gt;吗? 【参考方案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 应用

Spring5---新特性(WebFlux)

在 Spring Webflux 中结合非阻塞和阻塞调用并返回结果

Spring webflux 和 Angular

爸爸又给Spring MVC生了个弟弟叫Spring WebFlux