ConflictingBeanDefinitionException:相同的类名,不同的包

时间:2017-06-16 09:45:53

标签: java spring

我在一个包中有一个dao:

package com.mypackage.dao;

@Repository
public class MyDao {
// some code here
}

我在子包中有另一个具有相同类名的dao:

package com.mypackage.one.dao;

@Repository
public class MyDao {
// some other code here
}

我有第三课,我试图使用自动装配注入bean:

import com.mypackage.one.dao;

public class TestClass{

@Autowired
private MyDao myDao;

}

部署时,我收到以下错误:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'myDao' for bean class [com.mypackage.dao.MyDao] conflicts with existing, non-compatible bean definition of same name and class [com.mypackage.one.dao.MyDao]

我的applicationContext.xml有:

<context:component-scan base-package="com.mypackage.dao"/>
<context:component-scan base-package="com.mypackage.one.dao"/>

我无法将类重命名为遗留应用程序。

这是什么解决方案?

我尝试使用限定符,但这不起作用。

添加以下行:

<bean id="oneMyDao" class="com.mypackage.one.dao.MyDao" />

并将自动装配更改为:

@Autowired
@Qualifier("oneMyDao")
private MyDao myDao;

但它仍然会引发同样的错误。

2 个答案:

答案 0 :(得分:1)

我认为你为同一个bean混合了XML和Java bean配置。 你的代码应该是这样的

package com.mypackage.dao;
@Repository
@Qualifier("myDAOBasePackage")
public class MyDao
{
// some code here
}



   package com.mypackage.one.dao;

    @Repository
    @Qualifier("myDAOSubPackage")
    public class MyDao {
    // some other code here
    }

用它来注入

@Autowired
@Qualifier("myDAOBasePackage")
private MyDao myDao;

答案 1 :(得分:0)

我认为问题在于bean的定义。你必须给你的豆子命名不同。

请尝试将注释更改为第一个dao的@Repository("dao1")和第二个dao的@Repository("dao2")。然后使用@Autowire@Qualifier("dao1")尝试@Qualifier("dao2") bean。

你也应该删除这一行

<bean id="oneMyDao" class="com.mypackage.one.dao.MyDao" />

如果您使用@Repository注释