当前位置: 首页 > 知识库问答 >
问题:

kotlin余式与反应Spring数据的应用

郑伟彦
2023-03-14

我正在尝试将一些项目从Spring Reactor迁移到kotlin Coroutines。我有一些基于spring webflux的控制器:

@RestController
class Controller(val productRepository: ProductsRepository) {

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

此控制器使用reactive spring数据存储库:

@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,controller中的函数find应该被翻译成suspend fun,并且这个函数应该返回Product类的实例,而不是Product的reactive单包装器。大概是这样的:

@RestController
class Controller(val productRepository: ProductsRepository) {

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

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

共有1个答案

柴磊
2023-03-14

这可以通过有用的Kotlinx-Coroutines-Reactor帮助库来实现,该库为项目反应堆Publisher提供了有用的扩展方法,以帮助将MonoFlux转换为kotlin Coroutines。

首先添加一个依赖项

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

(如果您使用spring-boot,您不必指定一个版本,因为它可以为您管理它)

@RestController
class Controller(val productRepository: ProductsRepository) {

    @GetMapping("/product")
    suspend fun find(@RequestParam id: String): Product? {
        return productRepository.findById(id).awaitFirstOrNull()
    }
}
 类似资料:
  • WebFlux Spring Boot事务性注释是否适用于反应式MongoDB? 我将WebFlux Spring Boot与反应式MongoDB配合使用,如: 我标记了我的一个方法进行测试。但似乎注释对我不起作用。如果此方法内部发生错误,那么它仍然会向我的mongoDB数据库添加原始数据。 我是否错过了一些东西,或者Spring Boot事务性注释无法与反应式MongoDB配合使用? 我使用Mo

  • 正在执行查询,但未得到任何结果。 路由器:-api/v1/service/appt/usr/{usr_id} 存储库代码, 从日志中查询, 项目表中的数据, 邮递员请求, 不确定这有什么问题。它不会返回记录。

  • 我开始更多地接受反应式编程,并试图将其应用于我的典型业务问题。我经常使用的一种模式是数据库驱动类。我有一些已定义的单元类,如ActionProfile,其实例由ActionProfileManager管理,它从数据库表中创建实例并将其存储在映射中 然而,如果我想让它更具反应性,那么创建地图会打破单子。我可以做的一种方法是将映射本身设置为可观察的,并返回一个monad来为客户端查找特定的键。然而,中

  • 问题内容: 我正在使用带有react的ES6 babel,现在对于较新版本的react,react DOM不再是它的一部分。我对以下代码的怀疑是,这是第一行吗?因为我无处需要React,但最后一行需要ReactDOM。 问题答案: 从版本开始,React 分为两个部分: React 和 ReactDOM。 您正在使用。因此,对您而言,在组件中绝对有意义。但是就React而言,尽管您不是直接使用Re

  • 我面临的问题是,有一个服务,我必须调用,这是一个传统的Spring启动应用程序,而不是反应性的! 下面是一个示例endpoint,它接近上述遗留系统的想法: 我知道我不能用这个来实现真正的反应性善,有没有一个快乐的非阻塞和阻塞的媒介我可以在这里实现? 谢谢

  • 如何为不支持流式处理的数据库提供反应式流 API?比如说dymodb。执行 get 调用时,dynamodb 将返回所有结果。因此,即使我将 get 调用包装在源中,如何处理来自下游阶段的背压?另外,如何实现写入 db 中的写入调用?我的水槽会是什么样子?任何关于此的指针都会有所帮助。