2016-01-11 55 views
0

我試圖實現的是具有帶動態name參數的@Resource。具體來說,我想用@Resource(name = "{JNDI_NAME_PARAM}")注入一個DataSource對象,因爲我們可以在應用程序服務器中配置許多數據源,並且應用程序使用的數據源在.xml或.config文件中定義。由於在編譯期間我不知道數據源的名稱,所以我需要能夠在運行時獲得它。現在我正在注入一個自定義的@ApplicationScoped bean,它使用InitialContext().lookup()在其@PostConstruct方法中創建一個數據源。不過,我很好奇(主要是因爲它更優雅),以至於如何使用@Resource註釋實現注射。使用具有動態參數的java註釋

我可以在應用程序服務器中創建一個自定義的默認JNDI名稱,並在需要時更改它指向的數據源,但這不能用於多個部署,並且很多時候我們已經部署了兩次應用程序,一次在測試中數據庫,並且一次在生產數據庫中,因此JNDI指向同時在兩個不同的數據源。

+0

好,回答您的標題的「問題」:你絕對不能有不固定在編譯註釋值時間。但是,這並不意味着你使用的任何東西都沒有非註釋方式來注入事物。 – immibis

回答

0

您可以使用基於方法的注入。 它需要setter方法(setMyDB)。

public class Test { 

    public javax.sql.DataSource myDB; 

    @Resource(name="student") 
    private void setMyDB(javax.sql.DataSource ds) { 
     myDB = ds; 
    } 
} 

如果名稱是已知的,我們可以有多個資源下

@Resources({ 

@Resource(your type) 
@Resource(your type) 
}) 
+0

我真的不明白。你的代碼片段是解決方案的一部分還是兩種不同的方式來實現這一點?此外,名稱是未知的,而不是預定義的。這不像我必須從JNDI名稱列表中選擇,我不知道選擇哪一個。 JNDI名稱由我們的技術人員定義,負責在客戶端的服務器上安裝應用程序。他所做的是解壓'.war',在'web.xml'上更改''並重新打包。另外創建一個包裝類並不是真正的解決方案,因爲我已經實現了類似的東西。我甚至可以使用@ @ Produces註解。 – Konstantine

+0

他們是不同的方式。您可以嘗試其他方法,通過使用靜態變量,將傳遞的值分配給此靜態變量,並且可以在@Resource(name = static_variable)的位置使用此變量。 –

+0

我試過了變量方法,但它必須是'final',否則它不會編譯 – Konstantine