jOOQ - 注入时 dslContext 为空

问题描述 投票:0回答:1

我正在使用 Spring Boot、jOOQ 和 R2DBC。

通过关注this帖子,我创建了一个DSLContext bean:

@Configuration
open class JooqConfig(private val cfi: ConnectionFactory) {

    @Bean
    open fun jooqContext(): DSLContext {
        return DSL.using(cfi).dsl();
    }
}

application.yml

spring:
  r2dbc:
    url: r2dbc:h2:mem:///~/db/testdb
    username: sa
    password: password

然后我创建了一个存储库。

@Repository
@Transactional
open class JooqUserRepository(private val dslContext: DSLContext) {
   suspend fun getUser(): Record {
      return dslContext.select() // dslContext is null
           .from(USER_MODEL)
          .awaitFirst()
   }
}

这会引发异常:

Cannot invoke "org.jooq.DSLContext.select(org.jooq.SelectFieldOrAsterisk[])" because "this.dslContext" is null
java.lang.NullPointerException: Cannot invoke "org.jooq.DSLContext.select(org.jooq.SelectFieldOrAsterisk[])" because "this.dslContext" is null

我检查了我的配置,

DSL.using(cfi).dsl()
肯定返回了一个对象。

我在这里缺少什么?我正在努力寻找有关如何使用 Spring Boot 和 R2DBC 进行此设置的文档。

spring-boot kotlin jooq r2dbc
1个回答
0
投票

我猜问题出在下一个:

如果您从

@Transactional
中删除
JooqUserRepository
,则将要注入的
dslContext
Bean 将不会被
null
:

这里的问题是,默认情况下,

final
中的方法是
Kotlin
,因此
Spring
无法为该类创建代理。

作为修复,你必须重写:

@Repository
@Transactional
open class JooqUserRepository(private val dslContext: DSLContext) {
   suspend fun getUser(): Record {
      return dslContext.select() // dslContext is null
           .from(USER_MODEL)
          .awaitFirst()
   }
}

@Repository
@Transactional
open class JooqUserRepository(private val dslContext: DSLContext) {
   open suspend fun getUser(): Record {
      return dslContext.select() // dslContext is null
           .from(USER_MODEL)
          .awaitFirst()
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.