WebFlux 功能:如何检测空的 Flux 和 return 404?
WebFlux functional: How to detect an empty Flux and return 404?
我有以下简化的处理函数(Spring WebFlux 和使用 Kotlin 的函数 API)。但是,我需要提示如何检测空的 Flux,然后在 Flux 为空时对 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)
}
来自 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
在内存中缓冲数据,因此这可能不是大列表的最佳选择。可能有更好的方法来解决这个问题。
除了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)))
我不确定为什么没有人谈论使用 Flux.java 的 hasElements() 函数,这会 return 一个 Mono。
使用Flux.hasElements() : Mono<Boolean>
函数:
return customerFlux.hasElements()
.flatMap {
if (it) ok().body(customerFlux)
else noContent().build()
}
我有以下简化的处理函数(Spring WebFlux 和使用 Kotlin 的函数 API)。但是,我需要提示如何检测空的 Flux,然后在 Flux 为空时对 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)
}
来自 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
在内存中缓冲数据,因此这可能不是大列表的最佳选择。可能有更好的方法来解决这个问题。
除了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)))
我不确定为什么没有人谈论使用 Flux.java 的 hasElements() 函数,这会 return 一个 Mono。
使用Flux.hasElements() : Mono<Boolean>
函数:
return customerFlux.hasElements()
.flatMap {
if (it) ok().body(customerFlux)
else noContent().build()
}