Почему мой менеджер транзакций думает, что мой SessionFactory не установлен

#spring

Вопрос:

Вот мой класс HibernateConfigurationAS400

 @Configuration
@EnableTransactionManagement
public class HibernateConfigurationAS400 {

    private static final Logger logger = Logger.getLogger(HibernateConfigurationAS400.class);

    @Bean
    public DataSource dataSourceAS400() {
        JndiObjectFactoryBean dataSourceAS400 = new JndiObjectFactoryBean();
        dataSourceAS400.setJndiName("java:comp/env/jdbc/DBAS400");
        dataSourceAS400.setResourceRef(true);

        logger.info("dataSourceAS400()");
        return (DataSource) dataSourceAS400.getObject();
    }

    @Bean
    public SessionFactory sessionFactoryAS400() {
        LocalSessionFactoryBean sessionFactoryAS400 = new LocalSessionFactoryBean();
        sessionFactoryAS400.setDataSource(dataSourceAS400());
        sessionFactoryAS400.setPackagesToScan(new String[] { "com.kable.web.hub.model.orderpower" });
        sessionFactoryAS400.setHibernateProperties(hibernateProperties());

        logger.info("sessionFactoryAS400()");
        return sessionFactoryAS400.getObject();
    }

    @Bean
    public HibernateTransactionManager transactionManagerAS400() {
        logger.info("transactionManagerAS400()");
        return new HibernateTransactionManager(sessionFactoryAS400());
    }

    @Bean 
    public SchemaMultiTenantConnectionProvider schemaMultiTenantConnectionProvider() {
        SchemaMultiTenantConnectionProvider schemaMultiTenantConnectionProvider = new SchemaMultiTenantConnectionProvider();
        schemaMultiTenantConnectionProvider.setDataSource(dataSourceAS400());

        logger.info("schemaMultiTenantConnectionProvider()");
        return schemaMultiTenantConnectionProvider;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.DB2400Dialect");
        properties.put("hibernate.show_sql", "true");
        properties.put("hibernate.format_sql", "true");
        properties.put("hibernate.use_sql_comments", "true");
        properties.put("hibernate.multiTenancy", "SCHEMA");
        properties.put("hibernate.tenant_identifier_resolver", "com.kable.web.hub.tenancy.CurrentTenantIdentifierResolverImpl");
        properties.put("hibernate.multi_tenant_connection_provider", schemaMultiTenantConnectionProvider());

        logger.info("hibernateProperties()");
        return properties;
    }
}
 

Когда запускается Tomcat, выдает ли он следующее исключение

 Sep 23, 2021 2:32:20 PM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManagerAS400' defined in com.kable.web.hub.hibernate.HibernateConfigurationAS400: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.hibernate4.HibernateTransactionManager]: Factory method 'transactionManagerAS400' threw exception; nested exception is java.lang.IllegalArgumentException: Property 'sessionFactory' is required
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4842)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5303)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.hibernate4.HibernateTransactionManager]: Factory method 'transactionManagerAS400' threw exception; nested exception is java.lang.IllegalArgumentException: Property 'sessionFactory' is required
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 23 more
Caused by: java.lang.IllegalArgumentException: Property 'sessionFactory' is required
    at org.springframework.orm.hibernate4.HibernateTransactionManager.afterPropertiesSet(HibernateTransactionManager.java:348)
    at org.springframework.orm.hibernate4.HibernateTransactionManager.<init>(HibernateTransactionManager.java:148)
    at com.kable.web.hub.hibernate.HibernateConfigurationAS400.transactionManagerAS400(HibernateConfigurationAS400.java:49)
    at com.kable.web.hub.hibernate.HibernateConfigurationAS400$EnhancerBySpringCGLIB$ba6e9cca.CGLIB$transactionManagerAS400$2(<generated>)
    at com.kable.web.hub.hibernate.HibernateConfigurationAS400$EnhancerBySpringCGLIB$ba6e9cca$FastClassBySpringCGLIB$9fb0e56.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356)
    at com.kable.web.hub.hibernate.HibernateConfigurationAS400$EnhancerBySpringCGLIB$ba6e9cca.transactionManagerAS400(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 24 more
 

Но в журналах есть следующее

 14:32:16 INFO [localhost-startStop-1]:hub.hibernate.HibernateConfigurationAS400.dataSourceAS400()31 - dataSourceAS400()
14:32:16 INFO [localhost-startStop-1]:hub.hibernate.HibernateConfigurationAS400.schemaMultiTenantConnectionProvider()57 - schemaMultiTenantConnectionProvider()
14:32:16 INFO [localhost-startStop-1]:hub.hibernate.HibernateConfigurationAS400.hibernateProperties()71 - hibernateProperties()
14:32:16 INFO [localhost-startStop-1]:hub.hibernate.HibernateConfigurationAS400.sessionFactoryAS400()42 - sessionFactoryAS400()
14:32:20 INFO [localhost-startStop-1]:hub.hibernate.HibernateConfigurationAS400.transactionManagerAS400()48 - transactionManagerAS400()
 

Вы можете видеть, что sessionFactoryAS400() вызывается и помещается в TransactionManager. Я в недоумении относительно того, почему Tomcat создает исключение.

Комментарии:

1. он жалуется на отсутствующее свойство, а не на отсутствующий компонент типа