设置:
测试配置(conf4k):
datasources {
default {
dialect=POSTGRES
options {
currentSchema=default
}
}
}
r2dbc {
datasources {
default {
dialect=POSTGRES
options {
currentSchema=default
}
}
}
}
flyway {
datasources {
default {
enabled=true
locations="classpath:databasemigrations"
schemas=["default"]
create-schemas=true
}
}
}
test-resources {
containers {
postgres {
image-name="postgres:12.12"
hostnames=["localhost"]
}
}
}Preconditions:
为了使Flyway和micronaut数据使用相同的数据库和测试容器,两者的数据源需要命名相同。
问题:
由于同时使用JDBC和R2DBC,所以创建了同步和反应性TransactionManagers bean,当我使用@TransactionManagers时,我会得到以下错误:
Multiple possible bean candidates found: [io.micronaut.transaction.jdbc.DataSourceTransactionManager, io.micronaut.transaction.sync.SynchronousFromReactiveTransactionManager]Thoughts:
我想,我可以用@TransactionalAdvice来解决这个问题,但是由于这两个数据源都需要相同的名称,所以这是不可能的。我试着用不同的名称命名数据源,但根本不起作用。
发布于 2022-11-21 19:20:30
发布于 2022-11-12 12:51:56
您可以尝试将Jdbc (默认)和Flyway(Flyway依赖于Jdbc Datasouce)的数据源名称更改为另一个名称,然后在您的Jdbc存储库中使用@TransactionalAdvice来选择它。
在同一个项目中,我有一个使用Flyway和R2dbc的Micronaut示例。
但是我还没有尝试过@Transactional,对于事务处理,我使用的是R2dbcOperations.withTransaction,它工作得很好。
public Mono<Long> deleteAll() {
var sql = "DELETE FROM customers";
return Mono.from(
r2dbcOperations.withTransaction(status ->
Mono.just(status.getConnection())
.flatMap(connection -> Mono
.from(connection.createStatement(sql).execute())
.flatMap(result -> Mono.from(result.getRowsUpdated()))
)
)
);
}检查我这里的Micronaut R2dbc示例,希望它有帮助。
https://stackoverflow.com/questions/74183112
复制相似问题