在春季4

时间:2017-09-22 15:12:15

标签: spring list autowired

我试图以这种方式自动装配接口列表:

@Autowired
private List<SomeInterface<SomeAbstractClass>> list;

这是我的界面和抽象类:

public interface SomeInterface<T extends SomeAbstractClass> 

public abstract class SomeAbstractClass implements Serializable 

这些是我的组件(它们最终应该在列表中):

@Component("componentA")
public class ImplementationA implements SomeAbstractClass<ClassAImpementingSomeAbstractClass> 

@Component("componentB")
public class ImplementationB implements SomeAbstractClass<ClassBImpementingSomeAbstractClass> 

抽象类的实现定义如下:

 public class ClassAImpementingSomeAbstractClass extends SomeAbstractClass
 public class ClassBImpementingSomeAbstractClass extends SomeAbstractClass

从Spring 3.2.5迁移到4.3.11后出现问题。 在第3季,我将获得具有ImplementationA和ImplementationB的核心列表。 搬到春季4后,我在部署期间遇到异常:

  

org.springframework.beans.factory.NoSuchBeanDefinitionException:没有   合格的bean类型   &#39;&的java.util.List LT; SomeInterface&LT; SomeAbstractClass&GT;&GT;&#39;可用:预期   至少有1个符合autowire候选资格的bean。依赖   注释:   {@ org.springframework.beans.factory.annotation.Autowired(所需=真)}

问题是为什么春天试图找到典型名单豆?难道不是在尝试找到SomeInterface类型的所有bean并将它们添加到列表中(特别是我在春季3上得到的)?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

Spring在4.0中使用泛型和bean定义改变了很多东西,以允许泛型成为bean等的限定符。

https://spring.io/blog/2013/12/03/spring-framework-4-0-and-java-generics

虽然我不能100%确定为什么这不再有效但我认为它现在要求你稍微具体一点,以便Spring正确评估这些限定符。 (或类似的东西)

无论哪种方式,你都应该通过这样做来解决它:

@Autowired
private List<SomeInterface<? extends SomeAbstractClass>> list;