Java SpringFramework:应为单个匹配bean,但找到2个

Java SpringFramework:应为单个匹配bean,但找到2个,java,spring,mongodb,spring-mvc,Java,Spring,Mongodb,Spring Mvc,我正在使用SpringFramework构建一个从MongoDB读取数据的项目,存储库和服务的结构如下所示: Repository: + Interfaces: - I <T extends Object> - I1 extends I<M1> - I2 extends I<M2> + Implements: - RI Abstract RI<T extends Obje

我正在使用SpringFramework构建一个从MongoDB读取数据的项目,存储库和服务的结构如下所示:

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
存储库:
+接口:
-我
-I1扩展I
-I2扩展I
+实施:
-抽象
-RI1扩展了RI实现I1
-RI2扩展了RI实现I2
服务:
+接口:
-硅
-SI1扩展了SI
-SI2扩展了SI
+实施:
-抽象SIIMPL:@autowiredi
-SI1IMPL:扩展SIIMPL实现SI1
-SI2IMPL:扩展SIIMPL实现SI2
当我运行时,它会抛出一个异常:

没有类型为“I”的合格bean可用:应为单个匹配 但是找到了2:I1,I2

当我删除RI2时,它工作正常。在我看来,我认为根本原因是@Autowired from Abstract(SIIMPL)到另一个抽象(I)之间的关系 两个工具是RI1和RI2,所以spring不知道选择哪个bean


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

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

public abstract class SIIMPL<T> {

   protected I<T> foo; // Don't autowire here

}
公共抽象类SIIMPL{
受保护的I foo;//不要在此处自动连线
}
然后如上所述,不要将泛型I对象自动关联到抽象类中,只需在那里定义它,然后通过构造函数注入将其自动关联到具体类中:

public class SI1IMPL extends SIIMPL<M1> implements ST1 {

  public ST1IMPL(@Autowired I<M1> foo) {
      this.foo = foo;
  }

}
公共类SI1IMPL扩展了SIIMPL实现ST1{
公共ST1IMPL(@Autowired I foo){
this.foo=foo;
}
}

非常感谢您。这真的很有帮助!没问题,很高兴我能帮忙:)