Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java appCtx中的多个事务遇到NonuniqueBeandDefinitionException_Java_Spring_Spring Mvc_Spring Transactions - Fatal编程技术网

Java appCtx中的多个事务遇到NonuniqueBeandDefinitionException

Java 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="

我正在开发基于Spring MVC的web应用程序,其中我有两个数据源,为此我需要维护两个事务**DataSourceTransactionManager**

我什么也没做,只是复制了我现有的Txn事务片段,并根据其他数据源对其进行了修改,请查看我的

app-ctx.xml

我无法理解,我将bean id隔离为,同时我引用了另一个数据源,即dataSourcePayroll


请让我知道实现这一目标的最佳解决方案,或者是否有其他解决方案

其中一种方法是指定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;