2011-06-28 20 views
1

我看到它的方式,有三種方法來獲得到另一個bean的引用:獲取對其他託管bean的引用的慣用方法是什麼?

  1. 使用CDI,我可以@Inject一個叫豆。這有缺點,即CDI註釋不能與臉部註釋混合,因此我不能再使用@ViewScoped
  2. 使用@ManagedProperty似乎是理想的,除了我必須介紹一個公共setter的工作,這傷害封裝。
  3. 我可以使用這樣的事情(在this answer建議):

    @SuppressWarnings("unchecked") 
    public static <T> T findBean(String beanName) { 
        FacesContext context = FacesContext.getCurrentInstance(); 
        return (T) context.getApplication().evaluateExpressionGet(
         context, "#{" + beanName + "}", Object.class); 
    } 
    

    我可以使用此方法在我@PostConstruct初始化屬性。這沒有上面的缺點,但似乎有點複雜。爲什麼我必須爲框架應該提供的東西編寫一個輔助方法?

我的問題是,我應該使用哪三種?此外,請隨時糾正我在上面的描述中可能提到的任何誤解,或者提出其他更優雅的方法來實現這一目標。

+0

看到我的更新和jan groth的回答。 – Bozho

回答

3

如果你真的不能沒有@ViewScoed的上帝,而你只想留在JSF和CDI--那麼就是第二。不要擔心外部依賴性的封裝。即使在臉部環境之外,您仍然需要設置另一個對象,因此需要設置一個setter。

如果你想添加接縫的圖片,並且你正在使用CDI,那麼第一個。看到詹·格羅斯的答案。

2

絕對是第一個,連同Seam 3 Faces(here)。只需將它放在classpath中,@Viewscoped就可以在CDI和JSF之間完美橋接:-)不用說,CDI擁有比JSF所提供的依賴注入更高的概念...

+0

+1,但我真的不喜歡他們決定處理這個問題的方式。一方面JSF和CDI是標準,但爲了做一些應該可以直接使用的東西,你需要一個專有的框架。 – Bozho

+0

感謝您的回答。儘管如此,我想盡可能保持簡單,所以我不會引入額外的框架。 –

+0

我明白 - 但_framework_是一個簡單的CDI擴展(並且可擴展是CDI概念的一部分)的大詞。如果你想避免依賴,只需使用這兩個類([ViewScopedExtension])(https://github.com/seam/faces/blob/master/impl/src/main/java/org/jboss/seam/faces/context /ViewScopedExtension.java)[ViewScopedContext](https://github.com/seam/faces/blob/master/impl/src/main/java/org/jboss/seam/faces/context/ViewScopedContext.java)) –

相關問題