1

我在 Spring Boot 中为 MongoRepository 编写了一个测试,测试工作正常。唯一的问题是,当测试结束时,我想要回滚,这样就不会因为测试导致数据库发生变化。

// package...

// imports...

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MetistrafficApplication.class)
@Rollback(true)
public class AppRepositoryTests {

    @Autowired
    private AppRepository appRepository;

    @Test
    public void insertTest() {
        App app = new App("test");
        App appInserted = appRepository.save(app);

        assertThat(appInserted.getName(), equalTo(app.getName()));
    }
}

我将@Transactional 放在@Rollback 之前,但出现此错误:

java.lang.illegalstateexception:Failed to retrieve PlatformTransactionManager for @Transactional test for test context

当我搜索错误时,我找不到任何带有 MongoRepository 的代码。那么,我该如何解决呢?

编辑:添加后@Transactional("PlatformTransactionManager"),我得到的错误变为:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'PlatformTransactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'PlatformTransactionManager' - neither qualifier match nor bean name match!
4

3 回答 3

3

据我所知,没有针对 MongoDB 的 Spring TransactionManager 的实现,因为它在 ACID 意义上不是事务性的。所以不,您不能在 MongoDB 中使用 @Transactional 注释,您必须手动进行所有清理,否则使用 DBUnit 并为 MongoDB 添加您自己的扩展。

编辑:正如Petter在他的回答中提到的,从 MongoDB 4.0 开始,MongoDB支持 ACID 事务,您可以在 GitHub 上找到官方 SpringData 示例,也可以在 Spring 的开发人员博客中找到该功能的发布帖子

于 2016-07-13T15:35:41.037 回答
2

现在您可以将 @Transactional 与 mongo 一起使用。看看这个例子:https ://www.baeldung.com/spring-data-mongodb-transactions

你需要 mongo 4.0。还需要启用 mongo 复制(mongod --replSet rs0

然后你需要把这个bean添加到你的spring应用程序中

@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
}

这足以@Transactional在您的代码中使用。

于 2019-06-24T15:13:34.813 回答
0

我猜你使用 try catch 块。如果你能避免try catch,那就更好了。无论如何,如果您需要回滚,您可以这样做。

 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
于 2019-09-05T14:33:09.053 回答