В настоящее время я слежу за учебником 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
}