一尘不染

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

spring-boot

我具有以下简化的处理程序功能(Spring
WebFlux和使用Kotlin的功能性API)。但是,我需要一个提示,当通量为空时,如何检测空的通量,然后对404使用noContent()。

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)
}

阅读 871

收藏
2020-05-30

共1个答案

一尘不染

来自Mono

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这会在内存中缓冲数据,因此对于大列表而言,这可能不是最佳选择。可能有更好的方法来解决此问题。

2020-05-30