2011-06-28 19 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)) –

相关问题