2017-08-14 111 views
0

我有2個bean。WELD-001409:類型T與限定符的模糊依賴關係@默認

第一個是我在生產中使用的型號,Model

@Named("model") 
@RequestScoped 
public class Model{ 

} 

第二個是我用於測試的Model的擴展。

@Named("modelTest") 
@RequestScoped 
public class ModelTest extends Model{ 

} 

如何強制CDI默認選擇Model

+0

無論如何,測試不應該擴展它所測試的類。 – Tom

+0

它不是一個junit測試。它是一個不同的測試。 Web組件的自定義測試。但它不重要。因爲如果我只有2個接口的實現,就會出現這個問題。 – user2914191

+1

看看[https://dzone.com/articles/java-ee6-cdi-named-components] – Egl

回答

1

既然你想改變給定類型的'默認'bean,並且你不想使用限定符,我假定原始bean不會被注入到任何地方。因此,你可能以後是替代或專業化。

如果我們談論替代,你需要@Alternative標註來標記新豆還「選擇」它 - 這可以在每一個bean檔案基礎上beans.xml完成或者乾脆用全球@Priority(int)。下面的代碼片段:

@Named("modelTest") 
@RequestScoped 
@Alternative 
@Priority(1) // "activates"/selects the alternative 
public class ModelTest extends Model{ 
} 

與選擇的替代方案,只要你注入之前的類型(Model),CDI反而會注入這種替代(ModelTest),因爲它適合注射點爲好。

次要選項是專業化。它與備選方案非常相似,但在原始豆被「丟棄」的方式上更加嚴格,您可以在CDI spec中閱讀更多關於此的信息。專業化還帶有限定符和bean名稱繼承(不在範圍!)。也沒有必要選擇bean(而不是替代品)。以下是代碼:

@RequestScoped 
@Specializes 
public class ModelTest extends Model{ 
    // bean name with be inherited automatically as "model" 
} 

請注意,根據規範,bean一次只能有一個bean名稱。因此,如果您繼承一個名稱並聲明另一個名稱,則會出現錯誤 - 相應地更改您的代碼。