如何将 kotlin 协程与响应式 Spring 数据结合使用

2024-04-24

我正在尝试将一些项目从 Spring Reactor 迁移到 kotlin 协程。我有一些基于 spring webflux 的控制器,如下所示:

@RestController
class Controller(val productRepository: ProductsRepository) {

    @GetMapping("/product")
    fun find(@RequestParam id: String): Mono<Product> {
        return productRepository.findById(id)
    }
}

该控制器使用反应式弹簧数据存储库:

@Repository
interface ProductsRepository : ReactiveMongoRepository<Product, String>

根据这个官方文件 -https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/languages.html#how-reactive-translates-to-coroutines https://docs.spring.io/spring/docs/5.2.0.M1/spring-framework-reference/languages.html#how-reactive-translates-to-coroutines,我的函数find控制器中应翻译为suspend fun并且此函数应该返回 Product 类的实例,而不是 Product 的反应式 Mono 包装器。像这样的东西:

@RestController
class Controller(val productRepository: ProductsRepository) {

    @GetMapping("/product")
    suspend fun find(@RequestParam id: String): Product {
        return productRepository.findById(id)
    }
}

但我的productRepository 处理Mono 和Flux,而不是挂起的函数。在这种情况下我应该如何正确使用 Spring 数据抽象?


这可以通过有用的kotlinx-coroutines-reactor帮助程序库为项目反应器提供有用的扩展方法Publisher在转换之间提供帮助Mono or Flux到 Kotlin 协程。

首先添加依赖

 <dependency>
     <groupId>org.jetbrains.kotlinx</groupId>
     <artifactId>kotlinx-coroutines-reactor</artifactId>
 </dependency>

(如果您使用 spring-boot,则不必指定版本,因为它会为您管理)

您现在可以使用kotlinx.coroutines.reactive.awaitFirstOrNull转换一个Mono<Product> to Product?并“等待”结果。

@RestController
class Controller(val productRepository: ProductsRepository) {

    @GetMapping("/product")
    suspend fun find(@RequestParam id: String): Product? {
        return productRepository.findById(id).awaitFirstOrNull()
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 kotlin 协程与响应式 Spring 数据结合使用 的相关文章

随机推荐