【问题标题】:SpringFramework: expected single matching bean but found 2SpringFramework:预期单个匹配 bean 但找到 2
【发布时间】:2018-04-22 09:32:34
【问题描述】:

我正在构建一个项目,使用 SpringFramework 从 MongoDB 读取数据,RepositoryService 的结构如下:

Repository:
    + Interfaces: 
        - I <T extends Object>
        - I1 extends I<M1>
        - I2 extends I<M2>
    + Implements: 
        - RI Abstract RI<T extends Object>
        - RI1 extends RI<M1> implements I1
        - RI2 extends RI<M2> implements I2

Service:
    + Interfaces: 
        - SI <T extends Object>
        - SI1 extends SI<M1>
        - SI2 extends SI<M1>
    + Implements:
        - Abstract SIIMPL : @Autowired I<?>
        - SI1IMPL : extends SIIMPL<M1> implements SI1
        - SI2IMPL : extends SIIMPL<M2> implements SI2

当我运行时,它会抛出异常:

没有可用的“I”类型的合格 bean:预期单一匹配 bean 但找到 2: I1,I2

当我删除 RI2 时,它可以正常工作。在我看来,我认为根本原因是 @Autowired 从 Abstract(SIIMPL) 到另一个 abstract(I) 2 个工具是 RI1 和 RI2,所以 spring 不知道该选什么 bean。

如果有人有任何想法,请给我留言。谢谢!

【问题讨论】:

    标签: java spring mongodb spring-mvc


    【解决方案1】:

    首先,您应该在抽象 SIIMPL 类中使用泛型而不是通配符。所以它看起来像:

    public abstract class SIIMPL<T> {
    
       protected I<T> foo; // Don't autowire here
    
    }
    

    然后如上所述,不要将通用 I 对象自动装配到抽象类中,只需在其中定义它,然后通过构造函数注入将其自动装配到具体类中:

    public class SI1IMPL extends SIIMPL<M1> implements ST1 {
    
      public ST1IMPL(@Autowired I<M1> foo) {
          this.foo = foo;
      }
    
    }
    

    【讨论】:

    • 非常感谢。真的很有帮助!
    • 没问题,很高兴我能帮上忙 :)
    猜你喜欢
    • 2016-04-12
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多