我正在使用 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 进行此设置的文档。
我猜问题出在下一个:
如果您从
@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()
}
}