Spring framework 4 Не работает универсальный класс зависимостей autowire
Весной 4 @Autowired не работает для класса, который расширяет регион, который расширяет карту
давая исключение
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 ответ
Так что, если я правильно следую за вами (трудно узнать наверняка без фрагмента кода), я предполагаю, что у вас есть что-то вроде этого...
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" в компонент приложения, пытается создать отображение всех bean-компонентов Spring, определенных в Spring ApplicationContext. Т.е. идентификатор бина / Имя -> ссылка на бин.
Итак, учитывая...
<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's) PdxInstance. Это данные в ваших (пользовательских) регионах. Поэтому, когда он пытается назначить все bean-компоненты в контексте Spring или в вашем пользовательском (настраиваемом) регионе, который Sprig определяет как "карту", он не может назначить bean-объекты других типов PdxInstance, принимая во внимание тип "Generic".
Короче говоря, используйте @Resource для автоматического подключения любого региона GemFire, пользовательского или другого.
Кроме того, я подвергаю сомнению необходимость "расширить" регион GemFire. Возможно, лучше вместо этого использовать обертку ("состав").
Надеюсь это поможет.
Ура!