2014-11-21 4 views
0

자바 EE 프로젝트를 스프링 부트 1.1.9로 변환 중입니다. 변환하기 전에 필자는 CDI 1.2에서 Dependency Injection에 익숙했습니다.스프링 부트 NoUniqueBeanDefinitionException

public interface AdminManager<V extends AdminView> 

나는 또한이 인터페이스의 몇 가지 구현이 있습니다

나는 인터페이스를 가지고있다. 그들은 다음과 같이 :

@Repository 
@Transactional(propagation=Propagation.REQUIRED) 
public class DBRuleManager implements AdminManager<AdminRuleView> 

@Repository 
@Transactional(propagation=Propagation.REQUIRED) 
public class DBFlagLogicManager implements AdminManager<AdminFlagLogicView> 

을 지금, 나는이 REST 엔드 포인트를 코딩 한 것을이 DBRuleManager 사용하도록되어 : 나는 mvn spring-boot:run을 실행하면

@Controller 
@RequestMapping("/admin/rule") 
public class RestAdminRule { 

    @Inject 
    private AdminManager<AdminRuleView> manager; 

} 

것은 내가 NoUniqueBeanDefinitionException 다음 얻을 :

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.company.server.admin.AdminManager] is defined: expected single matching but found 2: DBRuleManager,DBFlagLogicManager 

스프링 4가 이러한 상황을 관리해야한다고 읽었습니다. 그럼 뭐가 문제 야? 이것은 CDI를 사용하여 잘 작동했습니다.

답변

1

다른 문제 (@Transactional 구현에 대한 프록시)를 해결할 때이 문제를 해결할 수있는 방법을 찾았습니다. 나는이 매개 변수를 사용 :

@EnableTransactionManagement(proxyTargetClass=true) 

을 그리고 난 내 AdminManager<AdminRuleView> 직접 주입 할 수 있었다. 나는 왜 그런지 이해하지 못한다 ...

+0

이상하지만 그것은 나를 위해 일했다. –

+0

'proxyTargetClass' 속성은 Spring이 의존성 주입이나 AOP를 위해 사용할 프록시의 종류를 정의합니다. JDK와 CGLib 중 두 가지가 있습니다. CGLib은 인터페이스 뒤에 숨겨진 클래스뿐만 아니라 구체적인 클래스 주입을 가능하게하므로 더욱 강력합니다. 'proxyTargetClass'는 CGLib를 가능하게합니다. 나는 우리 문제와 관련이없는 것 같지만, CGLib은 리플렉션에 더 강력하고 우리의 경우에도 효과가 있다고 생각합니다. 그것은 단지 충분하게 문서화되지 않았습니다. – mrik974