2010-01-28 49 views
6

我有創建服務實現列表的ServiceListFactoryBean:如何自動裝配的FactoryBean

<bean id="services" 
     class="org.springframework.beans...ServiceListFactoryBean" 
     p:serviceType="ServiceInterface"/> 

我可以訪問使用ApplicationContext的服務沒有問題:

final List services = ctx.getBean("services", List.class)); 

我也可以用繁體constructor-arg注入成功:

<bean id="aClass" class="AClass"> 
    <constructor-arg ref="services"/> 
</bean> 

但是,如果我嘗試自動導入依賴ency

@Autowired @Qualifier("services") private List services; 

然後我拿到引起BeanCreationException通過

FatalBeanException: No element type declared for collection [java.util.List] 

我使用Spring 3.0。

回答

10

事實證明,答案是...

@Resource(name="services") private List services; 
+1

這確實會起作用,因爲現在它通過名稱而不是按類型自動裝配。以前就是這種情況。可能你是在這個時候解決了問題。但你必須明白爲什麼。所以,請仔細思考提供的答案。乾杯。 – 2010-01-28 09:40:34

+0

醋 - 整個項目中只有兩個bean(到目前爲止),無論是否使用@Qualifiers,或者明確地將默認自動裝配設置爲byType或byName,@Autowiring都不適用於此ServiceListFactoryBean。 – 2010-01-28 11:30:17

4

異常消息是從DefaultListableBeanFactory,它的complining它不能自動裝配你的領域,因爲List沒有泛型類型(見DefaultListableBeanFactory線716)。

嘗試在您的字段e.h中添加一個通用簽名。

@Autowired @Qualifier("services") private List<Service> services; 
+0

是的,你釘了下來。 +1 – 2010-01-28 10:20:51

+2

不,這恐怕不行。顯式地將autowire設置爲byType,並得到: 找不到匹配的[ServiceInterface]類型的[爲服務接口] – 2010-01-28 11:26:12

0

我今天居然找到了,就是當你需要映射bean的名字到指定接口的實例,也沒有必要的@Qualifier的任何形式的FactoryBean代碼。 Spring會爲你找到並注入候選人。爲了以防萬一,@Resource沒有做它的工作。