一尘不染

SpringFramework:预期单个匹配的bean,但发现2

spring-mvc

我正在建立一个使用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

我跑步时会抛出异常:

没有可用的’I’类型的合格Bean:可能是单个匹配的Bean,但找到了2:I1,I2

当我删除RI2时,它可以正常工作。我认为,根本原因是@Autowired从Abstract(SIIMPL)到另一个abstract(I),它具有RI1和RI2两个实现,因此spring不知道该选择哪种bean。

如果有人有任何想法,请给我评论。谢谢!


阅读 339

收藏
2020-06-01

共1个答案

一尘不染

首先,您应该在Abstract 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;
  }

}
2020-06-01