Java appCtx中的多个事务遇到NonuniqueBeandDefinitionException
我正在开发基于Spring MVC的web应用程序,其中我有两个数据源,为此我需要维护两个事务**DataSourceTransactionManager** 我什么也没做,只是复制了我现有的Txn事务片段,并根据其他数据源对其进行了修改,请查看我的 app-ctx.xml 我无法理解,我将bean id隔离为,同时我引用了另一个数据源,即dataSourcePayrollJava appCtx中的多个事务遇到NonuniqueBeandDefinitionException,java,spring,spring-mvc,spring-transactions,Java,Spring,Spring Mvc,Spring Transactions,我正在开发基于Spring MVC的web应用程序,其中我有两个数据源,为此我需要维护两个事务**DataSourceTransactionManager** 我什么也没做,只是复制了我现有的Txn事务片段,并根据其他数据源对其进行了修改,请查看我的 app-ctx.xml 我无法理解,我将bean id隔离为,同时我引用了另一个数据源,即dataSourcePayroll 请让我知道实现这一目标的最佳解决方案,或者是否有其他解决方案 其中一种方法是指定bean的名称 <bean id="
请让我知道实现这一目标的最佳解决方案,或者是否有其他解决方案 其中一种方法是指定bean的名称
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" name="oldOne">
<property name="dataSource" ref="dataSource" />
</bean>
<!----- NEWLY ADDED Txn-------->
<bean id="erptransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" name="newOne">
<property name="dataSource" ref="dataSourcePayroll" />
</bean>
然后使用限定符
package com.awzpact.prayas.service;
import com.awzpact.prayas.dao.HRMSPickSalaryDataDAO;
import com.awzpact.uam.domain.SalaryDetailReport;
import com.awzpact.uam.domain.Userdetail;
import com.awzpact.uam.exceptions.MyExceptionHandler;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
*
* @author jack
*/
@Service
public class NewPayrollService {
final TransactionDefinition erpTxnDefination = new DefaultTransactionDefinition();
final TransactionDefinition prayasTxnDefination = new DefaultTransactionDefinition();
final int BATCH_SIZE = 500;
public void getSalarayData(final String yearMonth, final String regionId, final String circleId, final Userdetail loginUser) {
final String tableSuffix = yearMonth.substring(4, 6) + yearMonth.substring(0, 4);
final TransactionStatus erpTransaction = erpTransactionManager.getTransaction(erpTxnDefination);
try {
List<SalaryDetailReport> list = hRMSPickSalaryDataDAO.findAll(yearMonth, regionId, circleId);
} catch (Exception e) {
}
final TransactionStatus prayasTransaction = prayasTransactionManager.getTransaction(prayasTxnDefination);
}
@Autowired
@Qualifier("oldOne")
DataSourceTransactionManager prayasTransactionManager;
@Autowired
@Qualifier("newOne")
DataSourceTransactionManager erpTransactionManager;
@Autowired
HRMSPickSalaryDataDAO hRMSPickSalaryDataDAO;
}
其中一种方法是指定bean的名称
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" name="oldOne">
<property name="dataSource" ref="dataSource" />
</bean>
<!----- NEWLY ADDED Txn-------->
<bean id="erptransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" name="newOne">
<property name="dataSource" ref="dataSourcePayroll" />
</bean>
然后使用限定符
package com.awzpact.prayas.service;
import com.awzpact.prayas.dao.HRMSPickSalaryDataDAO;
import com.awzpact.uam.domain.SalaryDetailReport;
import com.awzpact.uam.domain.Userdetail;
import com.awzpact.uam.exceptions.MyExceptionHandler;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
/**
*
* @author jack
*/
@Service
public class NewPayrollService {
final TransactionDefinition erpTxnDefination = new DefaultTransactionDefinition();
final TransactionDefinition prayasTxnDefination = new DefaultTransactionDefinition();
final int BATCH_SIZE = 500;
public void getSalarayData(final String yearMonth, final String regionId, final String circleId, final Userdetail loginUser) {
final String tableSuffix = yearMonth.substring(4, 6) + yearMonth.substring(0, 4);
final TransactionStatus erpTransaction = erpTransactionManager.getTransaction(erpTxnDefination);
try {
List<SalaryDetailReport> list = hRMSPickSalaryDataDAO.findAll(yearMonth, regionId, circleId);
} catch (Exception e) {
}
final TransactionStatus prayasTransaction = prayasTransactionManager.getTransaction(prayasTxnDefination);
}
@Autowired
@Qualifier("oldOne")
DataSourceTransactionManager prayasTransactionManager;
@Autowired
@Qualifier("newOne")
DataSourceTransactionManager erpTransactionManager;
@Autowired
HRMSPickSalaryDataDAO hRMSPickSalaryDataDAO;
}
问题是在bean定义中给了您不同的bean id,并且您使用的属性具有不同的名称。所以Spring容器无法识别为prayasTransactionManager和erpTransactionManager分配了哪一个bean 解决方案是对bean定义使用相同的bean id,该bean id用作属性名。 就你而言:
<!----- EXISTING Txn-------->
<bean id="prayasTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!----- NEWLY ADDED Txn-------->
<bean id="erpTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourcePayroll" />
</bean>
注:最佳实践是为bean id和属性名依赖用例模式提供有意义的名称 问题是,在bean定义中,您被赋予了不同的bean id,并且您使用的属性具有不同的名称。所以Spring容器无法识别为prayasTransactionManager和erpTransactionManager分配了哪一个bean 解决方案是对bean定义使用相同的bean id,该bean id用作属性名。 就你而言:
<!----- EXISTING Txn-------->
<bean id="prayasTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!----- NEWLY ADDED Txn-------->
<bean id="erpTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourcePayroll" />
</bean>
注:最佳实践是为bean id和属性名依赖用例模式提供有意义的名称 你刚刚搞定了@Aleydin,非常感谢,伙计,但是帮我一个忙,你能告诉我到底是什么问题吗?问题是Spring不知道选择这两个bean中的哪一个,因为你有两个DataSourceTransactionManager类型的bean。指定DataSourceTransactionManager类型的两个bean的名称并告诉您要使用@Qualifier不会再混淆Spring 1+对于非常有用的信息,非常感谢Aleydin,顺便说一句,您的名字与Aladdin相似:,希望您介意:DYou刚刚搞定了@Aleydin,非常感谢伙计,但请帮我一个忙,你能告诉我到底是什么问题吗?问题是Spring不知道选择这两个bean中的哪一个,因为你有两个DataSourceTransactionManager类型的bean。指定DataSourceTransactionManager类型的两个bean的名称并告诉您使用@Qualifier所需的名称不会再混淆Spring 1+,非常感谢Aleydin,顺便说一句,您的名称类似于Aladdin:,希望您介意:D
@Autowired
@Qualifier("transactionManager")
DataSourceTransactionManager prayasTransactionManager;
@Autowired
@Qualifier("erptransactionManager")
DataSourceTransactionManager erpTransactionManager;