我试图以这种方式自动装配接口列表:
@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上得到的)?
感谢您的任何建议!
答案 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;