Spring 5.2 принес поддержку сопрограмм Kotlin, Spring реактивный WebClient
получил поддержку сопрограмм в расширениях Kotlin.
Я создал бэкэнд-сервис, который выставляет GET /posts
как поток, проверьте коды здесь .
@GetMapping("")
fun findAll(): Flow<Post> =
postRepository.findAll()
В примере клиента я пытался использовать WebClient для использования этого API следующим образом.
@GetMapping("")
suspend fun findAll(): Flow<Post> =
client.get()
.uri("/posts")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange()
.awaitBody()
Не удалось из-за сериализации Джексона типа Flow.
Из-за метода awaitXXX в вышеприведенном выражении я должен использовать модификатор suspend
для этой забавы.
Но работает следующее, если я изменил тип тела на Любой, проверьте коды участников .
GetMapping("")
suspend fun findAll() =
client.get()
.uri("/posts")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange()
.awaitBody<Any>()
После прочтения сопрограмм Kotlin Spring ref doc, поток должен быть преобразован в поток сопрограмм Kotlin. Как бороться с типом возврата Flow и удалить suspend
здесь?
Обновление : тип возврата изменен на Flow, проверьте последние исходные коды здесь, я думаю, что это может быть частью Spring 5.2.0.M2. Модификатор suspend
необходим для двухэтапных операций с сопрограммами в webclient api, как объяснено ниже Себастьеном Делезом.