我想对Spring的testframework使用两种不同的DAO实现。
src.main.java
.businessobjects
\-User.java
.dao
\-IUserDAO.java
.daojpa
\-UserDAO.java
.daohibernate
\-UserDAO.java
春季测试用例:
src.test.java.base:
package base;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/hibernate-beans.xml")
@Transactional
public abstract class SpringTestCase {}
这是错误:
引起: java.lang.IllegalStateException: 注释指定的bean名称 bean类的'userDAO' [jpadao.UserDAO] 与现有的冲突, 不兼容的bean定义相同 名称和类 [jpaadao.UserDAO]
我已经尝试使用限定符来覆盖自动装配,例如:
<bean class="jpaadao.UserDAO">
<qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
<qualifier value="jpa"/>
</bean>
然后在带有
的测试用例接线中@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;
但错误仍然存在。
两个问题:
答案 0 :(得分:2)
你正在使用没有名字的bean,所以Spring会尝试提出一个名字,这个名字可能基于你可能在你的班级上有的@Component注释,但它也可能是你的版本你的bean的非限定类名(在两种情况下,它们都会相等,并导致Spring对象)。
此外,您似乎正在以对我来说有点奇怪的方式混合组件扫描和xml配置。
有很多方法可以解决这个问题,但是最干净的是你只会使用一个实现你试图完成的合同的bean。如果你确实需要不同的实现,你应该给它们不同的和更具描述性的名称:
<bean id="jpaUserRepository" class="..JpaUserRepository"/>
这将为您提供更有用的日志记录,即使您从未使用bean名称,因为您依赖于自动布线。
答案 1 :(得分:1)
此致
Sam(Spring TestContext Framework的作者)
P.S。不,您遇到的问题与SPR-4524无关。
答案 2 :(得分:0)
您可以尝试使用@Resource
注释按名称注入依赖项。您必须为bean提供名称(ID)或使用默认值,即非大写的非限定类名。
答案 3 :(得分:0)
我现在已经开始运行了!但是,我不相信这是最佳做法。我只是通过写入appContext.xml来排除不需要的DAO的路径:
<context:component-scan base-package="test">
<context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter>
</context:component-scan>
有什么建议吗?这个问题可能与http://jira.springframework.org/browse/SPR-4524相关吗?