Spring框架4通用类依赖关系autowire不起作用

时间:2015-09-02 16:27:19

标签: java spring spring-data-gemfire

在春季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也会出错。

1 个答案:

答案 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区域。也许最好使用包装器(“组合”)。

希望这有帮助。

干杯!