2016-03-02 61 views
3
@Autowired 
private List<WalletService<Wallet>> walletServices; //Doesn't work 

@Autowired 
private List<WalletService> walletServices; //Everything is fine 

假設我們有:春季4.2.4。自動裝配擴展通用接口列表

interface A<T extends W>; 
interface B extends A<W1>; 
interface C extends A<W2> ; 
class W1 extends W; 
class W2 extends W; 

我知道這是可能注入我可以注入一個列表的或特定的A的列表,以避免一個明確的投List<A> to List<A<W>>? 現在,當我嘗試一些我得到org.springframework.beans.factory.NoSuchBeanDefinitionException

我覺得這個功能是必要的實現類這樣的層次結構:

interface WalletService<T exends Wallet> 
interface TradeWalletService extends WalletService<TradeWallet> 
interface PersonalWalletService extends WalletService<PersonalWallet> 

也許我失去了一些東西。 在此先感謝您的回覆!

+0

什麼是你的春天版本? –

+0

Spring 4.2.4版本。 – DmRomantsov

回答

2

的根源來自於Java的泛型定義,使WalletService<TradeWallet>不是WalletService<Wallet>,一個子類,因此春季無法比擬的豆類。 在解決方案的可使用上界通配符:

private List<WalletService<? extends Wallet>> walletServices; 

還有一個替代方案,這是容易出錯的,並且具有副作用。如果你註釋你的WalletService,以便Spring爲它創建一個代理對象,WalletService<TradeWallet>WalletService<PersonalWallet>都將被包裝到代理對象中,對於外部世界來說,它們看起來都不是WalletService,而沒有任何泛型信息。只要你想注入,例如WalletService<TradeWallet>就會導致問題,並且Spring將失敗,因爲代理對象都與此bean定義匹配。