当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中有条件地配置transactionManager时使用事务性注释?

柴增
2023-03-14

对于条件sessionFactory beans,我将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!

我希望spring跳过条件transactionManager bean在某些情况下对它们不是由条件创建的bean进行验证。

共有1个答案

龙飞文
2023-03-14

我实现了一个无操作的SessionFactory,并在禁用archive_mode时在spring配置类中实例化它:

SpringConfig.java

    @Bean("archiveSessionFactory")
    public SessionFactory archiveSessionFactory() {
        return ServerConf.ARCHIVE_MODE ? createNormalSessionFactory() : new DummySessionFactory();
    }

    @Bean("archiveTransactionManager")
    public HibernateTransactionManager archiveTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(archiveSessionFactory());
        return transactionManager;
    }

dummySessionFactory.java

public class DummySessionFactory implements SessionFactory {
...
    // These two methods call in spring initializing and we have to implement them
    @Override
    public Metamodel getMetamodel() {
       return new MetamodelImpl(null);
    }

    @Override
    public Map<String, Object> getProperties() {
       return null;
    }

    //Throw suitable exception in other methods
    @Override
    public Session getCurrentSession() throws HibernateException {
        throw new HibernateException("Desired mode is Disabled");
    }
...
}
 类似资料:
  • 我正在尝试了解如何使用Spring。 我试着效仿这个例子。但是,当我从Eclipse启动Tomcat时,我得到了以下错误: 这是DispatcherServlet的相关代码。xml salvaUtente()是一种方法,我将在其中处理多个插入(现在仍然是exmpty)。

  • 我对Spring交易非常陌生。由于我的组织使用的一些代码标准,我要求在调用任何方法时加入父事务(如果存在)。 我的应用程序是一个SpringMVC应用程序,有三层 Web层(控制器类) 服务层(包含业务逻辑的服务类) DAO Layer(数据库相关查询的DAO(数据访问层)类) 现在,在服务层上的一个方法中使用了dao层的三种不同方法。我使用@transactional将此服务方法注释为事务性的。

  • 问题内容: 不合理,无法通过注释而不是纯XML Bean来配置Spring Bean,现在我正面临后果。 我使用以下方式配置REST通道 现在,我只需要简单地将设置为仅将此具有非null值的字段输出到JSON。我尝试了以下方法: Bean被创建,但是转换器的另一个实例已创建并在通道中使用。所以我已经尝试过这种方法并在Stackoverflow问题中进行了描述,但是json序列化仍然使用其自己的配置

  • 最后,我尝试通过 但我以结束。所以现在我别无选择,所以我在这里征求任何想法。如何控制和配置框架使用的映射器?

  • 我正在一个项目中使用。我计划对任务中的业务数据和Spring审计数据使用不同的数据源。所以我配置了如下内容: 而主数据源是通过自动配置的。 当公开一个bean时,问题就出现了,因为在上有一个。因此绑定到发生。 到目前为止,这似乎是因为这个错误造成的 因此,我试图模仿的功能,在我的业务数据源/entityManager上定义自己的。 注意我必须用以外的名称来定义它,否则会找到2个bean并抱怨(不管

  • 我在我的项目中使用spring data jpa和spring mvc。然而,我总是得到错误。 如果我注释jpaconfig.java,我的应用程序运行良好。 我不知道为什么?请你帮帮我: 我的代码: WebAppConfig.java jpaconfig.java 应用程序.属性