"No transaction in context"例外从何而来?



我正在使用反应式MongoDb驱动程序,方法是向我的Spring Boot项目添加spring-boot-starter-data-mongodb-reactive依赖项。升级到 Spring Boot 2.2.x 后出现了此错误。

事实证明,如果我做一些简单的事情,比如:

class Something(@Id val name: String)
@Repository
interface SomethingRepository: ReactiveCrudRepository<Something, String>
@SpringBootTest
class DemoApplicationTests
{
@Autowired protected lateinit var repository: SomethingRepository
@Test
fun test()
{
repository
.save( Something("1") )
.onErrorContinue { throwable, _ -> println(throwable.message) }
.block()
}
}

我得到输出:

...
2019-12-12 20:58:48.379  INFO 24425 --- [    Test worker] com.example.demo.DemoApplicationTests    : Started DemoApplicationTests in 2.545 seconds (JVM running for 3.987)
No transaction in context
No transaction in context
...

这似乎很奇怪,原因如下:

  1. 对象将成功保存到数据库中。
  2. 即使
  3. 管道由Mono组成,也会报告两次错误
  4. onErrorContinue的文档建议操作员删除导致错误的元素,该错误与 1 冲突。
  5. 该错误是由NoTransactionInContextException引起的,该是springframework.transaction的一部分,但我什至没有对事务做任何事情。

有人遇到过这个问题吗?这是框架中的错误,还是我做错了什么?

onErrorContinue 将 OnNextFailureStrategy.ResumeStrategy 放入订阅者上下文中。此策略忽略元素。

当方法为事务时,Spring 将事务放入订阅者上下文中。 然后 Spring 尝试在上下文中查找事务,如果事务不存在,则抛出异常。默认情况下,Spring 在非事务方法中忽略此异常并继续执行。 但是在onError的情况下继续OnNextFailureStrategy.ResumeStrategy控制并忽略元素。

你可以试试这个:

Flux.just(something1, something2)
.flatMap(this::save)
.subscribe();

private Mono<Something> save(Something s) {
return Mono.just(s)
.flatMap(somethingRepository::save)
.onErrorResume(t -> {
log.error("Failed to save : {}", s, t);
return Mono.empty();
});
}

相关内容

最新更新