2016-02-25 39 views
1

本文介紹了,您可以注入RequestScoped豆成ApplicationScoped豆類和請求中的客戶端代理將指向正確的實例: Bean instance of a shorter scope injected in a bean instance of a larger scope in CDI - how does it work?注漿RequestScoped CDI豆成ApplicationScoped CDI豆通過製作類

這是如何工作的當使用一個獨立的生產者類來做一些額外的處理並生成RequestScoped bean? 部署到應用程序服務器後,由於託管bean和我的生產者方法都符合條件,因此由於依賴性不明確而導致部署異常。

+0

我擺脫了我的生產者類,並直接在我的RequestScoped Bean中執行其他處理。這似乎是一個更好的方法,所以一切都在一個地方,而不是分佈在兩個班級。 – phivo

回答

1

事實上,它的工作原理。在這種情況下,CDI impl只是在需要時執行您的@Produces方法。

你得到了你的異常,因爲CDI按類型搜索bean,並且你有兩個相同類型的定義。所以如果你已經聲明已經有bean了@Produces你不能讓CDI在類路徑上有完全相同的bean定義。

下面的例子是無效的:

@ApplicationScoped 
public class SomeFactory { 

    @Produces 
    public SomeBean produceSome() { 
     return new SomeBean(); 
    } 
} 

@RequestScoped // bug, redundant definition 
public class SomeBean { 
} 

詩篇。細節還取決於bean-discovery-mode的實際價值。

你也可以看看這個樣本SO answer。我個人並不喜歡自動發現和類路徑掃描 - 但這個概念存在於CDI和Java EE的基礎上。這是我通常不推薦人們使用Java EE服務器的原因之一。

+0

好的,所以唯一的解決方案是使用自定義限定符。當我們注入字符串時,我們在過去使用這種方法。所以我寧願去完全擺脫製片人。感謝您的澄清! – phivo

+0

不客氣。 PS。要明確,自定義限定符不是唯一的解決方案。另一種方法是從所有bean中刪除bean-discovery-mode =「annotated」'',爲此您有Producers方法,任何「bean定義註釋」。 –