所以,如果我正确地跟随你(如果没有代码片段很难确定),我假设你有这样的东西......
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 区域的必要性。也许最好使用包装器(“组合”)。
希望这可以帮助。
干杯!