spring Multi DataSource @Service注释,包含现有错误

时间:2014-12-09 07:34:58

标签: spring spring-mvc mybatis spring-annotations

我有一个代码是Spring Framework中的一个错误

错误原因我知道 所以我不知道如何解决这个问题。

我正在使用mybatis库

我有两个Account DataBase的多个DataSource

我创建了一个root-context.xml ----------------------- root-context.xml ---------------------- -------------------------------------

Oracle帐户1测试1

<bean id="dataSourceTest1" class="org.apache.commons.dbcp.BasicDataSource" destroy-m

ethod="close">
      <property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
      <property name="url" value="jdbc:log4jdbc:oracle:thin:@111.111.1111.1111:1111:Test1"/>
      <property name="username" value="TEST1"/>
      <property name="password" value="TEST1"/>
      <property name="maxIdle" value="200"/>
      <property name="maxActive" value="200"/>
      <property name="minIdle" value="5"/>
    </bean>

    <bean id="sqlSessionFactoryTest1" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSourceTest1" />
      <property name="mapperLocations" value="classpath*:test/service/server/test1/**/*.xml" />
    </bean>


     <bean id="sqlSessionTest1" class="org.mybatis.spring.SqlSessionTemplate" name="sqlSessionTest1">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryTest1" />
    </bean>

    <mybatis-spring:scan base-package="test.service.server.test1" template-ref="sqlSessionTest1" />

Oracle Account test2

<bean id="dataSourceTest2" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
      <property name="url" value="jdbc:log4jdbc:oracle:thin:@222.222.2222.222:2222:Test2"/>
      <property name="username" value="Test2"/>
      <property name="password" value="Test2"/>
      <property name="maxIdle" value="200"/>
      <property name="maxActive" value="200"/>
      <property name="minIdle" value="5"/>
    </bean>


    <bean id="sqlSessionFactoryTest2" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSourceTest2" />
      <property name="mapperLocations" value="classpath*:test/service/server/test2/**/*.xml" />
    </bean>


     <bean id="sqlSessionTest2" class="org.mybatis.spring.SqlSessionTemplate" name="sqlSessionTest2">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryTest2" />
    </bean>


    <mybatis-spring:scan base-package="test.service.server.test2" template-ref="sqlSessionTest2"/>

----------------------- root-context.xml END ------------------ ---------------------------------------

我没有使用上下文:component-scan

<!-- <context:component-scan base-package="test.service.server.test1.test1service"/>-->
<!-- <context:component-scan base-package="test.service.server.test2.test2service"/>-->

我使用SpringJUnit4每个单元测试

顺序执行(DataSourceTest和SqlSessionFactory Test和SqlSession测试mapperScanTest)。

在mapperScanTest之前没有任何问题。

但是,星号使用注释@Service

时会发生错误

------------------------------------------服务接口代码 - ----------------------------------

public interface Test2_SERVICE {

    public List<Test2_VO> GET_ListVO();

}

-------------------------------------------实施服务代码 - ---------------------------------

@Service("Test2_SERVICE") *//<--Error annotaion*
public class Test2_SERVICEIMPLE implements Test2_SERVICE{

    @Resource
    Test2_MAPPER mapper;

    @Override
    public List<Test2_VO> GET_ListVO() {
        return mapper.GET_ListMapperVO();
    }

}

---------测试代码------------------------------

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/**/*-context.xml" })
    public class TestService {

    Logger logger = Logger.getLogger(Thread.currentThread().getClass());    

        @Autowired
        @Qualifier("Test2_SERVICE")
        Test2_SERVICE test2_SERVICE;



        @Override
        public void testString() {


            logger.info("---------------------");
            List<Test2_VO> listVO = test2_SERVICE.GET_ListVO();
            logger.info(listVO );
            logger.info("---------------------");
        }


    }

错误讯息-----------------------------------

  

引起:   org.springframework.context.annotation.ConflictingBeanDefinitionException:   bean类的注释指定bean名称'Test2_SERVICE'   [test.service.server.test2.test2service.Test2_SERVICE]与。冲突   同名和类的现有的,不兼容的bean定义   [test.service.server.test2.test2service.Test2_SERVICEIMPLE]

-----------------------------------------------末端---------------------------------------------

@Service("Test2_SERVICE") *//<--Error annotaion*

问题直到对象Test2_MAPPER

才存在

但是,错误始于Test2_SERVICE

@ Service ("Test2_SERVICE") Where there is only used here (Test2_SERVICEIMPLE).

由于这个问题

我痛苦了三天..

有人告诉我解决此错误消息的问题。

感谢您阅读我的文章。

1 个答案:

答案 0 :(得分:1)

问题是您使用此注释为Test2_SERVICEIMPLE创建名为“Test2_SERVICE”的bean:

@Service("Test2_SERVICE")
//creates the bean with id="TEST2_Service" of the type Test2_SERVICEIMPLE
public class Test2_SERVICEIMPLE implements Test2_SERVICE

然后将此Test2_SERVICEIMPLE bean准确分配给接口Test2Service

@Autowired
@Qualifier("Test2_SERVICE")
//here you assign the bean of the not matching type Test2_SERVICEIMPLE to 
//a variable of type Test2_SERVICE
Test2_SERVICE test2_SERVICE;

这意味着接口想要使用bean来实现...

只需删除/更改@Qualifier("Test2_SERVICE")或更改@Service("Test2_SERVICE")

的名称即可

如何autowire annotation qualifiers以及如何name autodetected components