如果 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的主要内容,如果未能解决你的问题,请参考以下文章

如果未找到上游主机,则设置 nginx 不会崩溃

仅当 Mono 为空时如何执行操作,如果不为空则抛出错误

Mono Winforms WebBrowser 错误 - 未找到 libgluezilla

如果未指定或为空,则设置默认 URL 参数

DateTime 列上的 Mono InvalidOperationException (SQL Server)

SQL Server中如果查询条件为空,则查询全部,如何实现?