1

在春季 4 中,@Autowired 不适用于扩展 Region 的类,该类扩展了 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 也会给出相同的错误。

4

1 回答 1

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(无论版本如何),每当它将“映射”自动装配到应用程序组件中时,都会尝试创建 Spring ApplicationContext 中定义的所有 Spring bean 的映射。即 bean ID/名称 -> 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

因此,在您的情况下发生的情况是,Spring 上下文中没有根据类型(GemFire 的)PdxInstance 定义的 bean。那是您(自定义)区域中的数据。因此,当它尝试分配 Spring 上下文或您的自动装配(自定义)区域中的所有 bean(Sprig 标识为“Map”)时,它不能将其他类型的 bean 分配给 PdxInstance,考虑到“Generic”类型。

因此,简而言之,使用 @Resource 自动装配任何 GemFire 区域,无论是自定义的还是其他的。

另外,我质疑“扩展” GemFire 区域的必要性。也许最好使用包装器(“组合”)。

希望这可以帮助。

干杯!

于 2015-09-03T16:22:47.430 回答