gpt4 book ai didi

spring - 如何在 Spring 响应式(Reactive) WebClient 中返回 Kotlin 协程流

转载 作者:行者123 更新时间:2023-12-02 07:18:07 24 4
gpt4 key购买 nike

Spring 5.2 带来了 Kotlin 协程支持,Spring 响应式(Reactive) WebClient 在 Kotlin 扩展中获得了协程支持。

我已经创建了后端服务,它将 GET /posts 作为 Flow 公开,检查代码 here .

@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 类型的 Jackson 序列化而失败。

由于上面表达式中的awaitXXX方法,我必须使用suspend修饰符来实现这个乐趣。

但是如果我将正文类型更改为 Any,则以下内容有效,请检查 compelete codes .

GetMapping("")
suspend fun findAll() =
client.get()
.uri("/posts")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange()
.awaitBody<Any>()

读完后the Kotlin Coroutines根据 spring ref doc,Flux 应转换为 Kotlin 协程 Flow。如何处理 Flow 的返回类型并在此处删除 suspend

更新:返回类型改为Flow,查看最新source codes在这里,我认为它可能是 Spring 5.2.0.M2 的一部分。 Webclient api 中的 2 阶段协程操作需要 suspend 修饰符,如下 Sébastien Deleuze 所解释的。

最佳答案

首先要理解的是,返回 Flow 不需要对处理程序方法本身使用挂起函数。对于 Flow,挂起函数通常在 lambda 参数中隔离。但在这个(常见)用例中,由于 WebClient 2 阶段 API(首先获取响应,然后获取正文),我们需要暂停处理程序方法以等待 awaitExchange然后获取带有 bodyToFlow 扩展名的 Flow 正文:

@GetMapping("")
suspend fun findAll() =
client.get()
.uri("/posts")
.accept(MediaType.APPLICATION_JSON)
.awaitExchange()
.bodyToFlow<Post>()

从 Spring Framework 5.2 M2 和 Spring Boot 2.2 M3 开始支持此功能(请参阅 related issue )。另请参阅我的related detailed blog post .

关于spring - 如何在 Spring 响应式(Reactive) WebClient 中返回 Kotlin 协程流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55684117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com