2012-06-18 2 views
0

genericDAO와 함께 Spring 3.0을 사용하고 있습니다. 나는이 있습니다GenericDAO 및 NoSuchBeanDefinitionException : 고유 bean 없음 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{ 

을하지만받을 때 그들에게 다음과 같이 주입 :

예상 하나의 일치 콩을하지만 3 발견 :

@Autowired 
A a; 

내가 얻을 [genericDAOImpl하는을 , B]

이유를 이해할 수 없습니다. 나는 또한 항상 GenericDao을 찾고 특정되지 않은 봄처럼 보이는

@Resource(name="A") 

와 나는 또한 항상 같은 예외를 얻을 @Qualifier하지만를 사용하여 시도조차

@Resource(type=A.class) 

함께 할 것을 시도 수업.

하지만 여전히 작동하지 않습니다. 그리고 나는 왜 그런지 이해할 수 없다.

제안 사항?

대단히 감사합니다.

+0

세 가지 경우 모두 동일한 오류 메시지가 표시됩니까? @Autowired 경우에는 "예상되는 단일 일치하는 bean"메시지를 얻을 수 있지만 @Resource (name = "A") 경우는 분명히 알 수 있습니다. getter와 멤버 변수 모두에 주석을 추가 할 수 있습니까? –

+0

도움 주셔서 대단히 감사합니다. 나는 당신을 응답하기 위해 체크를 두 번했습니다. 그렇습니다. @Resource (name = "specific_name")를 사용할 때 org.springframework.beans.factory.NoSuchBeanDefinitionException이 발생합니다 : [xxx.model.entities.dao] 유형의 고유 bean이 없습니다. GenericDAO]가 정의 됨 : 기대되는 일치하는 단일 bean이지만 발견 된 3 : [genericDAO, A, B]. 귀하의 질문에 대해 나는 getter 주석을 달지 않았다. – CalamarBicefalo

+0

@CalamarBicefalo qualifer 이름이 인터페이스와 동일합니다. 이것은 틀린 것입니다. – NimChimpsky

답변

1

정확한 오류 메시지가 재현되어 수정되었습니다. 다음은 패키지 이름을 제외한 사용 된 소스 코드입니다. 나는 그것을 복사하고 그것을 실행하고 당신과 그것을 diffing하는 것이 좋습니다. 내가 알아챈 한 가지 차이점은 AImpl이 컴파일되지 않았다는 것입니다. GenericDAOImpl과 GenericDAO를 모두 구현합니다. 첫 번째 일반 매개 변수를 Turno로 변경하여 컴파일했습니다. 나는 이것이 오타라고 생각한다. 처음에 @Autowired로 모든 필드를 설정할 때 나는 당신의 오류를 정확히 재현했습니다. 그런 다음 @Qualifier ("genericDAO")를 추가했으며 성공적으로 3 개를 모두 연결했습니다.

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 단계의 원인으로도 사용합니다. 다음은 내가받는 메시지의 관련 부분 문자열입니다.

autowire 필드를 사용할 수 없습니다 : genericdao.GenericDAO genericdao.Thingy.genericDao; 중첩 예외 org.springframework.beans.factory.NoSuchBeanDefinitionException이다 : [A는, B가 genericDAO]

그것은 나타냅니다 된 타입의 고유 빈이 [genericdao.GenericDAO] 정의된다 : (3) 단일 매칭 빈을 예상하지만 발견 자동 전화를받지 않는 필드는 Thingy.genericDao이고 Thingy.a이 아닙니다. 나는 이것이 귀하의 오류에도 해당 될 것이라고 강력하게 의심합니다.

+0

그것은 그것을했다. 사실 문제는 내가 자격을 부여하지 않고 'genericDAO'를 주입하려고 시도한다는 것이 었습니다. 그러나 그것은 내가 특정한 주입에서 그것을 해결하기 위해보고 있었기 때문에 나를 미쳤게하고 있었다. 대단히 감사합니다. @ 존 와츠 (Jon Watts), 정말 도움이되었습니다. 나는 평판이 없기 때문에 대답을 투표 할 수 없다. '( – CalamarBicefalo

+0

환영합니다. 답변을 수락 해 주셔서 감사합니다. 봄 예외에 대한 의견이 도움이되기를 바랍니다. 종종 필요한 정보가 포함되어 있지만 바다에서 길을 잃을 수도 있습니다. 원인의. –

+0

예외 추적을주의 깊게 읽는 것은 내 실수를 찾은 방법이었습니다. 그렇습니다. 귀하의 의견은 정말로 도움이되었습니다. – CalamarBicefalo

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 

한정자 이름이 일치하는 한 잘 수행해야합니다. 이 에러는 인터페이스가 두 번 구현되는 주입을 autowiring하면 발생합니다.

+0

NimChimpsky 고맙습니다.하지만 말했듯이 @Resource (name = "specific_name")와 @Resource (type = specific_class.class)를 모두 사용하면 정확히 동일한 예외가 발생합니다. – CalamarBicefalo

+0

@CalamarBicefalo 내가 변경 한 사항을 살펴보십시오. 인터페이스 이름은 qualifer와 동일하므로 문제가 발생합니다. 내가 그렇게하는 방법은 잘 작동합니다. – NimChimpsky

+0

마지막 답장에서 말했듯이, 여전히 작동하지 않습니다. 어쨌든 @NimChimpsky에게 감사드립니다. 구현 이름과 임의의 이름을 모두 시도했습니다. – CalamarBicefalo