【问题标题】:spring framework : expected single matching bean but found 2spring 框架:预期单个匹配 bean 但找到 2
【发布时间】:2017-11-13 05:14:49
【问题描述】:

这个超类 DAO:

public class CrudDAO{

}

这个子类:

@Repository
public class JnsTimeDao extends CrudDAO {

}

@Repository
public class BatchDAO extends CrudDAO {
}

这个超级服务类

@Transactional(readOnly = true)
public abstract class CrudService<D extends CrudDAO> {

    @Autowired
    protected D dao;
}

启动错误:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: 否 [com.gp.dao.CrudDAO] 类型的限定 bean 已定义:预期 单个匹配 bean 但找到 2:batchDAO,jnsTimeDao

【问题讨论】:

  • 你有 2 个 CrudDAO 类型的 bean,一个是 JnsTimeDaoBatchDao。因此 Spring 运行时抱怨重复的 bean。您应该确保 Spring 运行时将找到其中任何一个作为合格的 bean 并将其连接。

标签: spring spring-framework-beans


【解决方案1】:

有 2 个 CrudDAO 类型的 bean。因此,Spring 将无法理解要注入哪个 bean。可以如下解决

@Repository("jnsTimeDao")
public class JnsTimeDao extends CrudDAO {

}

@Repository("batchDao")
public class BatchDAO extends CrudDAO {
}

注入时使用@Qualifier

 @Transactional(readOnly = true)
    public abstract class CrudService<D extends CrudDAO> {

        @Autowired
        @Qualifier("batchDao")
        protected D dao;
    }

【讨论】:

  • 请将@Transactional(readOnly = true) 改为@Transactional() 作为默认值
  • 虽然这是正确的,但使用面向 trait 的自定义 Qualifier 会比基于 bean ID 的更好。
  • CrudService 是超类
  • 受保护的 D 道;模棱两可
猜你喜欢
  • 2016-07-11
  • 2016-04-12
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2012-01-14
  • 2014-08-18
  • 1970-01-01
相关资源
最近更新 更多