在春季4 @Autowired不适用于扩展Map扩展Map
的类给予例外
No qualifying bean of type [com.gemstone.gemfire.pdx.PdxInstance] found for dependency [map with value type com.gemstone.gemfire.pdx.PdxInstance]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
可能假设是一个集合注入点。如何解决问题。即使添加@Qualifier也会出错。
答案 0 :(得分:2)
所以,如果我正确地关注你(很难确定没有代码片段),我认为你有类似的东西......
class MyRegion<K, V> extends Region<K, V> {
...
}
则...
@Component
class MyApplicationComponent {
@Autowired
private MyRegion<?, PdxInstance> region;
}
是吗?
因此,问题是,您无法使用@Autowired注入或自动将Region引用连接到应用程序组件中。你必须使用@Resource,就像这样......
@Component
class MyApplicationComponent {
@Resource(name = "myRegion")
private MyRegion<?, PdxInstance> region;
}
原因是,Spring(无论版本如何),默认情况下,无论何时将“Map”自动装配到应用程序组件中,都会尝试创建Spring ApplicationContext中定义的所有Spring bean的映射。即bean ID /名称 - &gt; bean参考。
所以,给定......
<bean id="beanOne" class="example.BeanTypeOne"/>
<bean id="beanTwo" class="example.BeanTypeTwo"/>
...
<bean id="beanN" class="example.BeanTypeN"/>
您最终会在...的应用程序组件中使用自动连接的地图。
@Autowired
Map<String, Object> beans;
beans.get("beanOne"); // is object instance of BeanTypeOne
beans.get("beanTwo"); // is object instance of BeanTypeTwo
...
beans.get("beanN"); // is object instance of BeanTypeN
所以,在你的情况下发生的事情是,在类型(GemFire)的PdxInstance中定义的Spring上下文中没有bean。这是您(自定义)区域中的数据。因此,当它尝试在Spring上下文或您的自动装配(自定义)区域中分配所有bean时,Sprig将其标识为“Map”,它不能将其他类型的bean分配给PdxInstance,并考虑“Generic”类型。
因此,简而言之,使用@Resource自动装配任何GemFire区域,自定义或其他。
另外,我质疑是否需要“扩展”GemFire区域。也许最好使用包装器(“组合”)。
希望这有帮助。
干杯!