0

我正在使用带有 genericDAO 的 Spring 3.0。我有这个:

public interface GenericDAO<T, ID extends Serializable>
...
@Repository("genericDAO")
public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {
...
public interface A extends GenericDAO<Turno, Long> {
...
public interface B extends GenericDAO<TipoTurno, Long> {
...
@Repository("A")
public class AImpl extends GenericDAOImpl<TipoTurno, Long>  implements A{
...
@Repository("B")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B{

但是当我尝试按如下方式注入它们时:

@Autowired
A a;

我得到:

预期单个匹配 bean,但找到 3:[genericDAOImpl,A,B]

我不明白为什么。我也试着用

@Resource(name="A")

乃至

@Resource(type=A.class)

我也尝试使用@Qualifier,但我总是遇到相同的异常,看起来 Spring 总是在寻找 GenericDao 而不是特定的类。

但它仍然无法正常工作。我不明白为什么。

有什么建议么?

非常感谢你。

4

2 回答 2

1

我复制了您的确切错误消息,然后修复了它。这正是我使用的源代码,减去包名。我建议复制它,运行它并与你的不同。我注意到的一个区别是,正如问题中所写,AImpl 无法编译。它实现了 GenericDAOImpl 和 GenericDAO。我将第一个通用参数更改为 Turno,以使其编译。我认为这是一个错字。当我最初将所有字段设置为 @Autowired 时,我准确地重现了您的错误。然后我添加了 @Qualifier("genericDAO") 并成功连接了所有三个。

public interface GenericDAO<T, ID extends Serializable> {}
...
@Repository("genericDAO")
public class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {}
...
public interface A extends GenericDAO<Turno, Long> {}
...
public interface B extends GenericDAO<TipoTurno, Long> {}
...
@Repository("A")
public class AImpl extends GenericDAOImpl<Turno, Long> implements A {}
...
@Repository("B")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B {}
...
public class TipoTurno {}
...
public class Turno {}
...
@Component
public class Thingy {
    @Autowired
    private A a;

    @Autowired
    private B b;

    @Autowired
    @Qualifier(value="genericDAO")
    private GenericDAO genericDao;
}
...
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("genericdao.xml");
        context.getBean(Thingy.class);
    }
}
...
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:annotation-config/>
    <context:component-scan base-package="genericdao"/>
</beans>

请注意,实际的错误消息比您提供的要长。阅读整件事寻找原因很重要。Spring 喜欢具有 5 甚至 10 级原因的异常堆栈跟踪。这是我收到的消息的相关子字符串:

无法自动装配字段:genericdao.GenericDAO genericdao.Thingy.genericDao;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义类型 [genericdao.GenericDAO] 的唯一 bean:预期单个匹配 bean 但找到 3:[A,B,genericDAO]

它表明没有被自动装配的字段是Thingy.genericDao,不是Thingy.a。我强烈怀疑这也是您的错误的情况。

于 2012-06-19T01:46:11.363 回答
0
@Repository("AImpl")
public class AImpl extends GenericDAOImpl<TipoTurno, Long>  implements A{
...
@Repository("BImpl")
public class BImpl extends GenericDAOImpl<TipoTurno, Long>  implements B{
...
@Resource(name = "AImpl")
A whatever; //I would normally call it aImpl

只要限定符名称匹配,您就可以开始了。该错误是由自动装配注入引起的,其中接口被实现了两次。

于 2012-06-18T12:14:05.760 回答