SpringBoot配置文件中配置双库时DataSource时报错找到两个数据源

一、配置类配置数据源时:

 

二、 配置文件配置时

错误代码如下:

2018-12-25 20:10:01.913 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: wzdxNavigationCalloutServiceDataSource,flowNavigationCalloutServiceDataSource
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	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:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at com.iflytek.mea.aisp.admin.WzdxApplicationStart.main(WzdxApplicationStart.java:21)
	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.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: wzdxNavigationCalloutServiceDataSource,flowNavigationCalloutServiceDataSource
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1041)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:345)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090)
	at org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer.init(DataSourceInitializer.java:77)
	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.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)
	at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134)
	... 23 common frames omitted

错误配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>

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

    <!-- *************************** group数据库配置 *************************** -->
    <bean id="wzdxNavigationCalloutServiceDataSource" class="com.alibaba.druid.pool.DruidDataSource" >
        <property name="driverClassName" value="${db.wzdx.driverClassName}"/>
        <property name="url" value="${db.wzdx.url}"/>
        <property name="username" value="${db.wzdx.username}"/>
        <property name="password" value="${db.wzdx.password}"/>
        <property name="initialSize" value="${db.wzdx.initialSize}"/>
        <property name="maxActive" value="${db.wzdx.maxActive}"/>

        <property name="connectionInitSqls" value="set names utf8mb4;"/>

        <property name="filters" value="stat"/>
    </bean>


    <!-- define the SqlSessionFactory -->
    <bean id="wzdxNavigationCalloutServiceSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="wzdxNavigationCalloutServiceDataSource"/>
        <property name="mapperLocations" value="classpath:xmlMapper/wzdx/*.xml"/>
    </bean>


    <bean id="MoveRequest" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.iflytek.mea.aisp.admin.model.dao.wzdx.MoveRequestDao"/>
        <property name="sqlSessionFactory" ref="wzdxNavigationCalloutServiceSessionFactory"/>
    </bean>

    <bean id="MoveRequestDealRecordsDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.iflytek.mea.aisp.admin.model.dao.wzdx.MoveRequestDealRecordsDao"/>
        <property name="sqlSessionFactory" ref="wzdxNavigationCalloutServiceSessionFactory"/>
    </bean>

    <bean id="MoveRequestStatDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.iflytek.mea.aisp.admin.model.dao.wzdx.MoveRequestStatDao"/>
        <property name="sqlSessionFactory" ref="wzdxNavigationCalloutServiceSessionFactory"/>
    </bean>


    <!--<bean id="dataStoreService"  class="com.iflytek.mea.storage.core.ceph.DataStoreImpl" init-method="init" />-->

    <!-- transaction manager, use JtaTransactionManager for global tx -->
    <bean id="wzdxNavigationCalloutServiceTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="wzdxNavigationCalloutServiceDataSource"/>
        <qualifier value="trans_group"/>
    </bean>

    <bean id="wzdxNavigationCalloutServiceTransactionTemplate"
          class="org.springframework.transaction.support.TransactionTemplate">
        <constructor-arg ref="wzdxNavigationCalloutServiceTransactionManager"/>
    </bean>

    <tx:annotation-driven transaction-manager="wzdxNavigationCalloutServiceTransactionManager"/>

    <!--<bean id="userMapperImpl" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
    <!--<property name="mapperInterface" value="com.iflytek.mea.aisp.admin.model.mapper.UserMapper" />-->
    <!--<property name="sqlSessionFactory" ref="navigationCalloutServiceSessionFactory" />-->
    <!--</bean>-->

    <!-- transaction manager, use JtaTransactionManager for global tx -->


    <bean id="flowNavigationCalloutServiceDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${db.flow.driverClassName}"/>
        <property name="url" value="${db.flow.url}"/>
        <property name="username" value="${db.flow.username}"/>
        <property name="password" value="${db.flow.password}"/>
        <property name="initialSize" value="${db.flow.initialSize}"/>
        <property name="maxActive" value="${db.flow.maxActive}"/>

        <property name="connectionInitSqls" value="set names utf8mb4;"/>

        <property name="filters" value="stat"/>
    </bean>

    <bean id="flowNavigationCalloutServiceSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="flowNavigationCalloutServiceDataSource"/>
        <property name="mapperLocations" value="classpath:xmlMapper/flow/*.xml"/>
    </bean>
    <bean id="LogUserSimpleSessionDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="com.iflytek.mea.aisp.admin.model.dao.flow.LogUserSimpleSessionDao"/>
        <property name="sqlSessionFactory" ref="flowNavigationCalloutServiceSessionFactory"/>
    </bean>


    <bean id="flowNavigationCalloutServiceTransactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="wzdxNavigationCalloutServiceDataSource"/>
        <qualifier value="trans_group"/>
    </bean>

    <bean id="flowNavigationCalloutServiceTransactionTemplate"
          class="org.springframework.transaction.support.TransactionTemplate">
        <constructor-arg ref="flowNavigationCalloutServiceTransactionManager"/>
    </bean>

    <tx:annotation-driven transaction-manager="flowNavigationCalloutServiceTransactionManager"/>

</beans>





解决方法如下:

                增加primary="true"即可

primary这个翻译过来是 首要的,首选的意思。

primary的值有true和false两个可以选择。默认为false。

当一个bean的primary设置为true,然后容器中有多个与该bean相同类型的其他bean,

此时,当使用@Autowired想要注入一个这个类型的bean时,就不会因为容器中存在多个该类型的bean而出现异常。而是优先使用primary为true的bean。


版权声明:本文为Loser100原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。