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. Возможно, лучше вместо этого использовать обертку ("состав").

Надеюсь это поможет.

Ура!

Другие вопросы по тегам