2016-04-22 21 views
0

問題:你好,我是有關於Java EE問題定製預選賽不會對注入工作

,我必須使用註釋像@注入@Stateless etcetc,但我不能得到一個解決方案後,閱讀了大量的文檔和示例etcetc似乎我的代碼應該工作,但肯定不是。所以問題是,我有這樣的

@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface BudgetsDs { 
} 

的界面上的自定義預選賽,我想在另一個對象注入它作爲這樣

@Dependent 
public class BudgetService { 

@BudgetsDs 
@Inject 
DataSource budgetsDS; 

... some getter, setter , etcetc... 

} 

成員字段我已經通過這個

https://docs.oracle.com/javaee/6/tutorial/doc/gjbck.html

和其他類似的文檔類似。 我試過用@EJB,@Stateless但它不起作用。 我認爲我目前在註釋中缺少一件大事, ,所以如果你有很好的教程,或者很好的建議,或者我想聽到他們的解釋。 我不要求一個完整的答案,但我想至少有一些線索。 歡迎任何人提供幫助。

編輯: 確切的錯誤就行

@BudgetsDs 
@Inject 
DataSource budgetsDS; 

budgetDS扔不滿意相關性:解決方案

:無豆注射點

EDIT2匹配

1)我實施了一個新的類ResourceProducer 正如約翰Ament 建議我使用@Produces和@Resource(name =「jdbc/myDataSource」), 爲我需要的每個數據源。

public class ResourceProducer { 

@Produces 
@BudgetsDs 
@Resource(name="jdbc/BudgetsDs") 
public DataSource budgetsDs; 

@Produces 
@OtherDs 
@Resource(name="jdbc/OtherDs") 
public DataSource otherDs; 

... 

} 

2)爲每個連接

// In a file 
@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface BudgetsDs { 
} 

// In a another file 
@Qualifier 
@Retention(RUNTIME) 
@Target({METHOD, FIELD, PARAMETER, TYPE}) 
public @interface OtherDs { 
} 

3)通過這種方式,注入工作得很好,我可以注入不同的數據源,我想,這樣的不同的自定義限定:

@Dependent 
public class BudgetService { 

@BudgetsDs 
@Inject 
DataSource budgetsDS; 

@OtherDs 
@Inject 
DataSource otherDs; 
... some getter, setter , etcetc... 

} 

還有另外一個解決方案下面這個也適用。

感謝aribeiro和John Ament。 我的第一個關於堆棧溢出的問題,真的很好地回答了社區

+0

你的'DataSource'的實現是否也有'@ BudgetsDs'註解? – aribeiro

+0

不,我只是直接在我的BudgetService類中使用它, – Koraxos

+0

爲了讓容器注入'DataSource'的正確實現,您還需要將您的限定符放在實現中。如果您注意到,在您提到的鏈接中,@ Informal限定符位於「InformalGreeting」類的開頭。然後,你可以在https://docs.oracle.com/javaee/6/tutorial/doc/gjban.html中看到,在Printer類上注入了一個問候語:'@Inject @Informal Greeting greeting;'。 – aribeiro

回答

1

您收到的錯誤是由於容器不知道如何匹配您創建的限定符和任何任何實現bean類型。

由於documentation狀態:

限定符是你申請一個bean

因此,爲了克服提到的錯誤的註釋,您需要申請相應的每個限定符DataSource執行:

@BudgetsDs 
public class BudgetDataSource extends DataSource { 
    (...) 
} 

@OtherDs 
public class OtherDataSource extends DataSource { 
    (...) 
} 

然後,容器將能夠針正確的實現,當你注入你的bean:

@Dependent 
public class BudgetService { 

    @BudgetsDs 
    @Inject 
    DataSource budgetsDS; 

    (...) 
} 

@Dependent 
public class OtherService { 

    @Inject 
    @OtherDs 
    DataSource otherDS; 

    (...) 
} 

作爲一個方面說明,我注意到,你在下面的Java EE 6文檔。我建議你遵循latest Java EE文檔。

+0

好吧,這就是我的想法,但我不知道我會嘗試,只需要吃。 I'v的投票,但我沒有足夠的聲譽來改變你的帖子的顯示分數 – Koraxos

+0

這個答案不正確。你可以用生產者字段/方法做同樣的事情。 –

+0

@JohnAment,爲什麼答案不正確,在這種情況下生產者有什麼優勢? – aribeiro