Создайте ненайденный ServerResponse, если Mono пуст - PullRequest
1 голос
/ 09 мая 2020

Я использую Spring Boot 2.2.6, Kotlin и сопрограммы для реализации простого API реактивного отдыха. Я пытаюсь использовать функциональный стиль .

Как я могу изменить следующий код, чтобы вернуть ответ 404 HTTP, если репозиторий возвращает пустой Mono<Task> (Task - простой класс моей доменной модели)?

suspend fun findOne(request: ServerRequest): ServerResponse {
    val id = request.pathVariable("id")
    val task = repository.findById(id)
    return ServerResponse
            .ok()
            .json()
            .bodyAndAwait(task.asFlow())
}

Обратите внимание, что я использую сопрограммы. Мне нужен экземпляр Flow. Примеры вроде и неприменимы.

Большое спасибо.

1 Ответ

2 голосов
/ 09 мая 2020

Я думаю, что реальный вопрос заключается в том, как преобразовать Mono в приостановленный результат.

Пожалуйста, посмотрите здесь .

Собственно, этот подход уже используется в примере, который вы ищете. Отметьте здесь

Обновить (добавить код)

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 Создан небольшой демонстрационный проект здесь .

...