当前位置: 首页 > 知识库问答 >
问题:

WebFlux功能:如何检测空Flux并返回404?

彭开畅
2023-03-14

我有以下简化的处理程序函数(Spring WebFlux和使用静态编程语言的函数API)。然而,我需要一个提示,如何检测空的Flux,然后在Flux为空时使用noContent()进行404。

fun findByLastname(request: ServerRequest): Mono<ServerResponse> {
    val lastnameOpt = request.queryParam("lastname")
    val customerFlux = if (lastnameOpt.isPresent) {
        service.findByLastname(lastnameOpt.get())
    } else {
        service.findAll()
    }
    // How can I detect an empty Flux and then invoke noContent() ?
    return ok().body(customerFlux, Customer::class.java)
}

共有3个答案

齐飞星
2023-03-14

除了Brian的解决方案外,如果您不想一直对列表进行空检查,可以创建一个扩展函数:

fun <R> Flux<R>.collectListOrEmpty(): Mono<List<R>> = this.collectList().flatMap {
        val result = if (it.isEmpty()) {
            Mono.empty()
        } else {
            Mono.just(it)
        }
        result
    }

就像你为Mono做的那样:

return customerFlux().collectListOrEmpty()
                     .switchIfEmpty(notFound().build())
                     .flatMap(c -> ok().body(BodyInserters.fromObject(c)))
曾高杰
2023-03-14

使用Flux。hasElements():Mono

return customerFlux.hasElements()
                   .flatMap {
                     if (it) ok().body(customerFlux)
                     else noContent().build()
                   }

鲜于念
2023-03-14

从一个单声道

return customerMono
           .flatMap(c -> ok().body(BodyInserters.fromObject(c)))
           .switchIfEmpty(notFound().build());

Flux

return customerFlux
           .collectList()
           .flatMap(l -> {
               if(l.isEmpty()) {
                 return notFound().build();

               }
               else {
                 return ok().body(BodyInserters.fromObject(l)));
               }
           });

请注意,CollectList缓冲内存中的数据,因此这可能不是大列表的最佳选择。可能有更好的方法来解决这个问题。

 类似资料:
  • 我正在我的项目中使用spring webflux。我的controller类调用返回Mono或Flux的服务类方法。 我正在尝试为我的服务类编写单元测试。我不确定如何为返回mono/flux的方法编写单元测试。我查看的大多数文章都建议我使用WebClientTest。但重点是,我在这里测试我的服务类。当我通过模拟服务类方法测试我的web层(控制器类)时,我使用了WebclientTest。 对如何

  • 我需要为我的反应式spring应用程序实现一个graphql查询解析器。 以下是我的graphlq模式: 我的解析器如下所示: 我使用的是5.0.2和5.2.4

  • 我正在使用Spring Webflow R2DBC将一些数据插入数据库。 要求提供数据- 控制器 服务 道 主要问题是我不知道如何让它等待所有结果返回并添加到最终

  • 我是反应编程和Spring WebFlux的新手。我想让我的应用程序1发布服务器发送的事件通过Flux和我的应用程序2不断地监听它。 我希望Flux按需发布(例如,当某些事情发生时)。我发现的所有示例都是使用Flux.Interval周期性地发布event,而且似乎没有办法在创建完Flux之后追加/修改其中的内容。 我怎样才能达到我的目标?或者我在概念上完全错了。

  • 问题内容: 对反应式编程感兴趣,我玩了《构建反应式RESTful Web服务》指南。并希望转移前途并添加一些单元测试。 我尝试使用普通的Junit / Mockito测试来测试我的处理程序()。但是,由于它是反应性的,因此处理程序将返回。所以我不得不用它来测试状态,但是无法抽出他的身体来测试它。在网络上搜索解决方案时,似乎所有示例都使用。 我的问题是: 鉴于所有示例都用于测试反应性REST服务,并