如果 Mono 为空,则创建未找到的 ServerResponse
Create a not found ServerResponse if a Mono is empty
我正在使用 Spring Boot 2.2.6、Kotlin 和协程来实现简单的反应式休息 API。我正在尝试使用 functional style.
如果存储库 return 是空的 Mono<Task>
(Task
是一个简单的 class 我的领域模型)?
suspend fun findOne(request: ServerRequest): ServerResponse {
val id = request.pathVariable("id")
val task = repository.findById(id)
return ServerResponse
.ok()
.json()
.bodyAndAwait(task.asFlow())
}
注意我用的是协程。我需要一个 Flow
的实例。 等示例不适用。
非常感谢。
我认为真正的问题是如何将 Mono 转换为悬浮结果。
请看here.
实际上,您正在查看的示例中使用了这种方法。
检查 here
更新(添加代码)
suspend fun findOne(req: ServerRequest): ServerResponse {
val id = req.pathVariable("id").toInt()
return taskRepo.findById(id)
.flatMap { task->ServerResponse.ok().json().body<Task>(task) }
.switchIfEmpty { ServerResponse.notFound().build() }
.awaitSingle()
}
更新 2
创建了一个小型演示项目 here。
我正在使用 Spring Boot 2.2.6、Kotlin 和协程来实现简单的反应式休息 API。我正在尝试使用 functional style.
如果存储库 return 是空的 Mono<Task>
(Task
是一个简单的 class 我的领域模型)?
suspend fun findOne(request: ServerRequest): ServerResponse {
val id = request.pathVariable("id")
val task = repository.findById(id)
return ServerResponse
.ok()
.json()
.bodyAndAwait(task.asFlow())
}
注意我用的是协程。我需要一个 Flow
的实例。
非常感谢。
我认为真正的问题是如何将 Mono 转换为悬浮结果。
请看here.
实际上,您正在查看的示例中使用了这种方法。 检查 here
更新(添加代码)
suspend fun findOne(req: ServerRequest): ServerResponse {
val id = req.pathVariable("id").toInt()
return taskRepo.findById(id)
.flatMap { task->ServerResponse.ok().json().body<Task>(task) }
.switchIfEmpty { ServerResponse.notFound().build() }
.awaitSingle()
}
更新 2 创建了一个小型演示项目 here。