2017-07-08 65 views
0

我有一個關於遺產和CDI的問題。 考慮兩個接口:遺產和CDI注入

  • 車廂接口
  • SportCar擴展汽車

    interface Car { 
    } 
    
    interface SportCar extends Car{ 
    
    } 
    
    
    class DefaultCar implements Car { 
    
    } 
    
    
    @FerrariQualifier 
    class DefaultSportCar implements SportCar { 
    
    } 
    

我想什麼來注入:

@Inject 
    private Car car; //inject DefaultCar 

    @Inject 
    @FerrariQualifier 
    private Car ferrari; //inject DefaultSportCar 


    @Inject 
    private SportCar sportCar;//inject DefaultSportCar 

哪有我這樣做?

+0

如果實際顯示您使用當前代碼獲得的模糊解析異常會很有幫助,假設這是您的問題。 – covener

回答

2

沒有任何進一步的例子或解釋,你需要注入第一個限定符@Default。

這顯然需要任何進一步的'汽車'有一個非@默認限定符附加到它,否則你有一個模棱兩可的決議,你試圖把東西壓入CDI不適合。

1

我想你誤解了CDI注射了一下。尤其是要做到這一點:

@Inject 
private Car car; //inject DefaultCar 

因爲任何汽車實現(跑車或普通一員)將適合這裏,你將結束與曖昧的分辨率。

作爲一個臨時的解決方案,爲用戶covener指出,但這樣勢必爲您介紹任何其他汽車實現無需預選賽儘快打破你可能會利用@Default預選賽。

的乾淨的解決方案也許是重新思考設計和改變的層次結構是這樣的:

interface Car { 
    // all cars, place common methods here 
} 

interface SportCar extends Car{ 
    // interface for all sport cars 
} 

interface ClassicCar extends Car{ 
    // interface for all non-sport cars 
    // this is what you will inject 
} 

class DefaultCar implements ClassicCar { 

} 

@FerrariQualifier 
class DefaultSportCar implements SportCar { 

} 

有了這個,你就可以:

@Inject 
private ClassicCar car; 

,並得到DefaultCar一個實例。其餘的注射將以同樣的方式工作。

另一種解決方案是使用限定符。

一般來說 - 無論何時遇到不明確的解決方案,您都有多個bean符合注入要求,您需要使用限定符或注入更具體的接口/類來縮小選擇範圍。