Ошибка репозитория - FactoryBean, который в данный момент находится в процессе создания, вернул null из getObject. в Атомикосе распределенная транзакция - PullRequest
0 голосов
/ 24 марта 2020

В настоящее время я слежу за учебником atomikos для распределенной транзакции с использованием конфигурации xml. Я получаю сообщение об ошибке на уровне хранилища с бобом фабрики сообщений, который в данный момент находится в процессе создания, и возвращает значение null из getObject. Я думаю, что нет никакой циклической зависимости в bean-компонентах, и соединение с базой данных также хорошо Когда я удаляю репозиторий из реализации сервиса, ошибки не возникает.

Ошибка, которую я получаю в консоли

Ошибка создания компонента с именем auctionServiceRequired_TX, определенного в ресурсе пути к классу [ spring-sender- mysql .xml]: не удается разрешить ссылку на bean-компонент auctionTarget при установке свойства bean-объекта target; вложенное исключение - org.springframework.beans.factory.UnsatisfiedDependencyException: ошибка при создании bean-компонента с именем auctionTarget: неудовлетворительная зависимость, выраженная через поле quoteRepository; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка создания компонента с именем «quoteRepository»: невозможно разрешить ссылку на компонент «jpaMappingContext» при установке свойства компонента «mappingContext»; вложенное исключение - org.springframework.beans.factory.BeanCurrentlyInCreationException: ошибка создания бина с именем 'jpaMappingContext': FactoryBean, который в данный момент находится в процессе создания, возвратил нуль из getObject

spring-sender- mysql. xml

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jpa="http://www.springframework.org/schema/data/jpa"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/springa-jpa.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd ">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
            <value>application.properties</value>
        </property>
    </bean>

    <bean id="datasourceAtomikos-01"
        class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
        <property name="uniqueResourceName"><value>JDBC-1</value></property>
        <property name="xaDataSource"><ref bean="xaDataSourceMySQL-01"  /></property>
        <property name="xaProperties">
            <props>
                <prop key="maxPoolSize">4</prop>
                <prop key="uniqueResourceName">xads1</prop>
            </props>
        </property>
        <property name="poolSize"><value>4</value></property>
    </bean>

    <bean id="xaDataSourceMySQL-01" class="com.mysql.cj.jdbc.MysqlXADataSource">
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <property name="pinGlobalTxToPhysicalConnection"><value>true</value></property>
        <property name="user"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
    </bean>


    <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
        <property name="forceShutdown"><value>true</value></property>
    </bean>

    <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
        <property name="transactionTimeout"><value>300</value></property>
    </bean>


    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">

        <property name="transactionManager"><ref bean="atomikosTransactionManager"  /></property>
        <property name="userTransaction"><ref bean="atomikosUserTransaction"  /></property>
    </bean>

    <bean id="springJtaPlatformAdapter" class="io.trustaml.AtomikosJtaPlatform">
        <property name="jtaTransactionManager" ref="transactionManager" />
    </bean>

    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    <bean id="quoteEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="datasourceAtomikos-01"/>
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.transaction.jta.platform">io.trustaml.AtomikosJtaPlatform</prop>
                <prop key="javax.persistence.transactionType">JTA</prop>
            </props>
        </property>
        <property name="packagesToScan" value="io.trustaml.model"/>
        <property name="persistenceUnitName" value="quotePersistenceUnit" />
    </bean>

    <jpa:repositories base-package="io.trustaml.repository" entity-manager-factory-ref="quoteEntityManager"/>

    <!-- Error in creating this bean -->
    <bean id="auctionTarget" class= "io.trustaml.service.AuctionServiceImpl">
    </bean>

    <bean id="auctionServiceRequired_TX" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager"><ref bean="transactionManager" /></property>
        <property name="target"><ref bean="auctionTarget"  /></property>
        <property name="transactionAttributes">
            <props>
                <prop key="confirm*">PROPAGATION_REQUIRED, -QuotesConfirmRollbackException, +QuotesNoRollbackException</prop>
                <prop key="find*">PROPAGATION_SUPPORTS, readOnly</prop>
            </props>
        </property>
    </bean>

    <bean id="auctionServiceRequiresNew_TX" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager"><ref bean="transactionManager" /></property>
        <property name="target"><ref bean="auctionTarget"  /></property>
        <property name="transactionAttributes">
            <props>
                <prop key="confirm*">PROPAGATION_REQUIRES_NEW, -QuotesConfirmRollbackException, +QuotesNoRollbackException</prop>
                <prop key="find*">PROPAGATION_SUPPORTS, readOnly</prop>
            </props>
        </property>
    </bean>
 </beans>

Репозиторий

public interface QuoteRepository extends JpaRepository<Quote, Long> {
    List<Quote> findByStatus(String status);
}

Хранилище, реализующее сервис

@Service
public class AuctionServiceImpl implements AuctionService{

    private static final Logger LOGGER = LoggerFactory.getLogger(AuctionServiceImpl.class);
    private static volatile boolean flipFlop = false;

    @Autowired
    private QuoteRepository quoteRepository;

    // other business logic goes here
}
...