Spring Boot LDAP 事务

问题描述 投票:0回答:1

我正在尝试为 LDAP 存储库启用事务。我找到了这个 https://docs.spring.io/spring-ldap/reference/transaction-support.html 文档,但它只描述了如何使用 beans.xml 文件启用它。在 Spring Boot 中,你通常没有这个,我不知道如何在 @Configuration 注解的类中以编程方式执行此操作。

以防万一您问:不,默认情况下似乎没有启用。当我调试 @Transactional 带注释的方法时,事务通常似乎正在工作(您知道 TransactionInterceptor、CGLib 以及所有正在使用的内容),但我认为默认情况下这仅处理 Jpa 存储库。我的方法仅由 repo.save 方法和硬编码的 RuntimeException 组成。但预期的回滚仍然没有发生。

更新: 我已经取得了一些进展:所以我想我成功地在 Spring Boot 样式中配置了 ContextSourceAndDataSourceTransactionManager:

@Bean
public TransactionManager transactionManager(DataSource dataSource, ContextSource contextSource) {
    var tx = new ContextSourceAndDataSourceTransactionManager();
    tx.setDataSource(dataSource);
    tx.setContextSource(contextSource);
    tx.setRenamingStrategy(new DefaultTempEntryRenamingStrategy());
    return tx;
}

当我调试ContextSourceAndDataSourceTransactionManager.doRollback方法时,我可以看到它实际上是在repository.save之后发生运行时异常时执行的。但新实体仍然在 LDAP 中而没有被回滚。

java spring-boot ldap
1个回答
0
投票

解决了它 - 所以这个配置实际上使它工作:

@Bean
public ContextSource contextSource(LdapContextSource ldapContextSource) {
    return new TransactionAwareContextSourceProxy(ldapContextSource);
}

@Bean
public TransactionManager transactionManager(DataSource dataSource, ContextSource contextSource) {
    var tx = new ContextSourceAndDataSourceTransactionManager();
    tx.setDataSource(dataSource);
    tx.setContextSource(contextSource);
    tx.setRenamingStrategy(new DefaultTempEntryRenamingStrategy());
    return tx;
}
© www.soinside.com 2019 - 2024. All rights reserved.