我正在建立一个使用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。
如果有人有任何想法,请给我评论。谢谢!
首先,您应该在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; } }