Spring 框架 4 通用 class 依赖自动装配不工作
Spring framework 4 Generic class dependency autowire is not working
In spring 4 @Autowired 不适用于 class 扩展 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 也会出现同样的错误。
所以,如果我没听错(没有代码片段很难确定),我假设你有这样的东西......
class MyRegion<K, V> extends Region<K, V> {
...
}
然后...
@Component
class MyApplicationComponent {
@Autowired
private MyRegion<?, PdxInstance> region;
}
是吗?
所以,问题是,您不能使用@Autowired 将区域引用注入或自动连接到您的应用程序组件中。你必须像这样使用@Resource...
@Component
class MyApplicationComponent {
@Resource(name = "myRegion")
private MyRegion<?, PdxInstance> region;
}
原因是,Spring(无论版本如何),默认情况下,无论何时将 "Map" 自动装配到应用程序组件中,都会尝试创建所有已定义的 Spring beans 的映射在 Spring ApplicationContext 中。 IE。 bean ID/Name -> 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 区域,自定义或其他方式。
此外,我质疑 "extend" GemFire 区域的必要性。也许最好改用包装器 ("composition")。
希望对您有所帮助。
干杯!
In spring 4 @Autowired 不适用于 class 扩展 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 也会出现同样的错误。
所以,如果我没听错(没有代码片段很难确定),我假设你有这样的东西......
class MyRegion<K, V> extends Region<K, V> {
...
}
然后...
@Component
class MyApplicationComponent {
@Autowired
private MyRegion<?, PdxInstance> region;
}
是吗?
所以,问题是,您不能使用@Autowired 将区域引用注入或自动连接到您的应用程序组件中。你必须像这样使用@Resource...
@Component
class MyApplicationComponent {
@Resource(name = "myRegion")
private MyRegion<?, PdxInstance> region;
}
原因是,Spring(无论版本如何),默认情况下,无论何时将 "Map" 自动装配到应用程序组件中,都会尝试创建所有已定义的 Spring beans 的映射在 Spring ApplicationContext 中。 IE。 bean ID/Name -> 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 区域,自定义或其他方式。
此外,我质疑 "extend" GemFire 区域的必要性。也许最好改用包装器 ("composition")。
希望对您有所帮助。
干杯!