我正在尝试将一些项目从 Spring Reactor 迁移到 kotlin 协程。我有一些基于 spring webflux 的控制器,如下所示:
@RestController
class Controller(val productRepository: ProductsRepository) {
@GetMapping("/product")
fun find(@RequestParam id: String): Mono<Product> {
return productRepository.findById(id)
}
}
Run Code Online (Sandbox Code Playgroud)
该控制器使用反应式弹簧数据存储库:
@Repository
interface ProductsRepository : ReactiveMongoRepository<Product, String>
Run Code Online (Sandbox Code Playgroud)
根据这个官方文档 - 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)
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的 productRepository 处理 Mono 和 Flux,而不是挂起的函数。在这种情况下,我应该如何正确使用 spring 数据抽象?