2014-11-21 113 views
0

我将Java EE项目转换为Spring Boot 1.1.9。在转换之前,我习惯于CDI 1.2用于依赖注入。Spring Boot 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

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

    @Inject 
    private AdminManager<AdminRuleView> manager; 

} 

当我运行mvn spring-boot:run我得到以下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 

我读过Spring 4应该管理这种情况。那么问题是什么?这在CDI中运行良好。

回答

1

当试图解决另一个问题(关于@Transactional实现代理)时,我找到了解决此问题的方法。 我用这个参数:

@EnableTransactionManagement(proxyTargetClass=true) 

然后我能我AdminManager<AdminRuleView>直接注入。我不明白为什么,虽然...

+0

奇怪,但它也适用于我。 – 2016-03-01 04:41:55

+0

'proxyTargetClass'属性定义了Spring将用于依赖注入或AOP的代理类型。其中有两个,JDK one和CGLib。 CGLib更强大,因为它可以实现具体的类注入,而不仅仅是隐藏在接口后面的类。 'proxyTargetClass'启用CGLib。我似乎与我们的问题没有任何关系,但我认为CGLib对于思考也更加强大,并且使我们的案例也可以发挥作用。这只是没有足够的文件。 – mrik974 2016-03-01 08:35:20