【发布时间】:2019-10-26 15:17:17
【问题描述】:
我在我的 spring 项目中使用了多个数据源。 我在项目启动时通过手动配置启用/禁用它们。 一次他们都可能是活跃的 所以 transactionManager bean 可能处于活动状态。
我在spring配置类中通过@Conditional注解实现。 当我在方法上使用禁用事务注释时,我有 NoSuchBeanDefinitionException。
当我有条件地定义 transactionManager bean 时,如何在方法上使用 transactional annotioan?
archiveTransactionManager bean 不是由 @Conditional 注释创建的,我希望 spring 跳过检查条件事务管理器的 bean 验证。
对于条件 sessionFactory bean,我将 Autowired 注释中的 'required' 参数设置为 false 以防止 spring 抛出 NoSuchBeanDefinitionException 但我应该为 @Transactional 做什么?
配置类
@Bean("archiveTransactionManager")
@Conditional(ArchiveCondition.class)
public HibernateTransactionManager archiveTransactionManager() {
HibernateTransactionManager transactionManager = new HibernateTransactionManager();
transactionManager.setSessionFactory(archiveSessionFactory());
return transactionManager;
}
事务方法
@Transactional(value = "archiveTransactionManager", readOnly = true)
private List<DocumentItem> loadArchivedDocumentItem() {...}
用法
if(GeneralSetting.isArchive)
documentService.loadArchivedDocumentItem();
当前结果:
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'archiveTransactionManager' available: No matching PlatformTransactionManager bean found for qualifier 'archiveTransactionManager' - neither qualifier match nor bean name match!
我希望在它们不是由条件创建的某些情况下对条件 transactionManager bean 进行 spring 跳过 bean 验证。
【问题讨论】:
-
它不会跳过检查,因为它内置在拦截器中。当不应该启用一个无操作拦截器时,您应该添加一个无操作拦截器。或者不要使用
@Transactional并在 java 中显式地编写事务表达式并使其成为有条件的。使用无操作事务管理器可能是最简单的。但是,如果没有 tx-manager 和 -session-factory 为什么要实例化这个 bean?不应该简单地忽略应用程序的整个模块/部分。 -
@M.Deinum 在某些情况下,例如在存档操作中,我设置 archive_mode 设置并运行 app.在这种模式下,一些方法会检查设置并对另一个数据源进行加号操作。我在所有模式下都有一个用于 cruds 功能的主要数据源。
标签: spring hibernate configuration spring-data spring-transactions