【问题标题】:Create a not found ServerResponse if a Mono is empty如果 Mono 为空,则创建未找到的 ServerResponse
【发布时间】: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 等示例不适用。

非常感谢。

【问题讨论】:

    标签: spring-boot kotlin spring-webflux project-reactor kotlin-coroutines


    【解决方案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。
    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多