gpt4 book ai didi

mongodb - "No transaction in context"异常从何而来?

转载 作者:行者123 更新时间:2023-12-02 21:19:14 29 4
gpt4 key购买 nike

我通过向我的 Spring Boot 项目添加 spring-boot-starter-data-mongodb-reactive 依赖项来使用响应式(Reactive) MongoDb 驱动程序。升级到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. 即使管道由 Mono 组成,也会报告两次错误
  3. The documentation onErrorContinue 的建议操作符丢弃导致错误的元素,这与 1 冲突。
  4. 该错误是由 NoTransactionInContextException 引起的,它是 springframework.transaction 的一部分,但我什至没有对事务执行任何操作。

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

最佳答案

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

当方法是事务性的时,Spring 将 Transaction 放入订阅者上下文中。然后 Spring 尝试在上下文中查找事务,如果事务不存在则抛出异常。默认情况下,Spring 在非事务方法中忽略此异常并继续执行。但在 onErrorContinue 的情况下,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();
});
}

关于mongodb - "No transaction in context"异常从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59312369/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com