如果 Mono 为空,则创建未找到的 ServerResponse
Posted
技术标签:
【中文标题】如果 Mono 为空,则创建未找到的 ServerResponse【英文标题】:Create a not found ServerResponse if a Mono is empty 【发布时间】:2020-08-25 02:12:31 【问题描述】:我正在使用 Spring Boot 2.2.6、Kotlin 和协程来实现一个简单的反应式休息 API。我正在尝试使用functional style。
如果存储库返回一个空的Mono<Task>
(Task
是我的一个简单的域模型类),如何更改以下代码以返回 404 HTTP 响应?
suspend fun findOne(request: ServerRequest): ServerResponse
val id = request.pathVariable("id")
val task = repository.findById(id)
return ServerResponse
.ok()
.json()
.bodyAndAwait(task.asFlow())
注意我正在使用协程。我需要一个Flow
的实例。 this 等示例不适用。
非常感谢。
【问题讨论】:
【参考方案1】:我认为真正的问题是如何将 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。
【讨论】:
感谢您的回复。你能给我一个具体的例子吗,从我的代码 sn-p 开始? var 任务:任务? = repository.findById(id).awaitFirstOrNull() 然后你检查任务是否为空并返回你想要的响应 另外,您可以更改控制器的功能以仅返回任务吗?而不是 ServerResponse。以上是关于如果 Mono 为空,则创建未找到的 ServerResponse的主要内容,如果未能解决你的问题,请参考以下文章
Mono Winforms WebBrowser 错误 - 未找到 libgluezilla