2011-08-23 36 views
7

我正在寫一個需要與我的DAO交互的(複合)組件。這裏是Java的部分是如何宣稱:注入資源到UIComponent(又名CDI在這裏工作嗎?)

@FacesComponent(value="selectLocation") 
public class SelectLocation extends UINamingContainer { 

要獲得DAO對象,我嘗試了CDI註解:

@Inject private LocationControl lc; 

,但這並沒有工作,所以我嘗試了面孔註釋:

@ManagedProperty (value = "@{locationControl}") private LocationControl lc; 

這兩種情況都沒有發生 - 屬性lc在構造函數完成後以null結束。

我在所有支持bean中使用CDI,它都可以工作。這將使用GlassFish 3.1.1中的Weld。有關如何獲取資源的任何建議?

+0

黨我還以爲你在那裏的東西 - 我試圖java.inject.Named,但仍然沒有喜悅。 – AlanObject

+0

添加@RequestScoped將導致應用程序無法部署:WELD-001437正常範圍的bean類javax.faces.component.UIComponent不可委派,因爲該類型是final或它包含最終方法public final javax.faces.component。 TransientStateHelper javax.faces.component.UIComponent.getTransientStateHelper()。 – AlanObject

+0

創建的組件允許用戶通過瀏覽這些對象的數據庫(JPA)來選擇Location對象。爲此,我需要直接或間接訪問DAO。但是,我的DAO與我的其他CDI託管的bean沒有區別 - 它們內部只有JPA註釋,例如@PersistenceContext。我現在正在閱讀CDI規範,以查看bean.xml中是否有某些內容可以提供幫助。 – AlanObject

回答

5

我現在有一個解決方法,它基本上放在CDI等人的鍋爐代碼中。人。應該廢除。我現在有這種方法:

public LocationControl getLocationControl() { 
    if (lc != null) return lc; 
    FacesContext fc = getFacesContext(); 
    Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class); 
    if (obj instanceof LocationControl) lc = (LocationControl) obj; 
    return lc; 
} 

我想知道是否有人有更好的解決方案。

2

我不知道它是否也適用於組件,但使用CDI + MyFaces CODI,您可以使用@Advanced標記組件。相應的監聽器應該能夠使用@Inject。如果它不起作用,您可以在他們的JIRA中創建一個功能請求。它們非常快,並且頻繁發佈。

或者您使用: MyBean myBean = BeanManagerProvider.getInstance()。getContextualReference(MyBean.class); 手動。

2

有沒有辦法做到這一點,沒有解決方法?

是的,只需要使用通常的支持bean。

<x:someComponent value="#{someBean.someProperty}" /> 

裹在必要時可重複使用的TAGFILE /複合材料,以保持乾燥:

<my:someComponent />