2015-09-02 2 views
1

Весной 4 @Autowired не работает для класса, который расширяет область, которая простирается MapSpring Framework autowire зависимость 4 Общий класс не работает

давая Exception

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 дает такую ​​же ошибку.

+0

Просьба предоставить соответствующий код для повторения проблемы. –

+1

@Autowired на самом деле работает .... но ваш PdxInstance не является управляемым bean bean-компонентом ... вы должны опубликовать свой конфигурационный файл Spring, класс java и т. Д., Чтобы получить помощь. – Pras

ответ

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 (независимо от версии), по умолчанию, когда он autowires «карту» в попытках компонентов приложения, чтобы создать отображение всех Весенние бобы, определенные в Spring ApplicationContext. То есть bean ID/Name -> bean reference.

Таким образом, учитывая ...

<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, нет компонентов. Это данные в ваших (пользовательских) регионах (регионах). Поэтому, когда он пытается назначить все компоненты в контексте Spring или ваш авторизованный (настраиваемый) регион, который Sprig идентифицирует как «карту», ​​он не может назначать beans других типов PdxInstance, принимая во внимание «общий» тип.

Итак, используйте @Resource для автопостановки любого региона GemFire, обычаем или иным образом.

Кроме того, я задаю вопрос о необходимости «расширить» регион GemFire. Возможно, лучше использовать обертку («состав»).

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

Cheers!

+0

@Resource не поддерживает общий автоузел работает –

Смежные вопросы