【问题标题】:What is the idiomatic way to get references to other managed beans?获取对其他托管 bean 的引用的惯用方法是什么?
【发布时间】:2011-06-28 11:40:48
【问题描述】:

在我看来,有三种方法可以获取对另一个 bean 的引用:

  1. 使用 CDI,我可以@Inject 命名 bean。这样做的缺点是 CDI 注释不能与面部注释很好地混合,因此我不能再使用 @ViewScoped
  2. 使用@ManagedProperty 似乎是理想的,除了我必须引入一个公共设置器才能使其工作,这会损害封装。
  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 中的属性。这没有上述缺点,但似乎有点复杂。为什么我必须为框架应该提供的东西编写辅助方法?

我的问题是,我应该使用以上三个中的哪一个?此外,请随时纠正我在上述描述中可能提出的任何误解,或提出其他(更优雅的)方法来实现该目标。

【问题讨论】:

  • 查看我的更新和 jan groth 的回答。

标签: jsf jsf-2 cdi


【解决方案1】:

如果你真的不能没有@ViewScoed,并且你只想留在JSF 和CDI - 那么第二个。不用担心外部依赖的封装。即使在 faces 上下文之外,您仍然必须以某种方式设置另一个对象,因此需要一个 setter。

如果您想在图片上添加接缝,并且无论如何您都在使用 CDI,那么第一个。请参阅 jan groth 的回答。

【讨论】:

    【解决方案2】:

    绝对是第一个,连同 Seam 3 Faces (here)。只需将它放在你的类路径中,@Viewscoped 就可以完美地在 CDI 和 JSF 之间架起桥梁 :-) 不用说,CDI 的依赖注入概念比 JSF 附带的要好得多...

    【讨论】:

    • +1,虽然我真的不喜欢他们决定处理这个问题的方式。 JSF 和 CDI 一方面是标准,但为了做一些开箱即用的东西,您需要一个专有框架。
    • 感谢您的回答。不过现在,我想让它尽可能简单,所以我不会介绍额外的框架。
    • 我理解——但 framework 对于简单的 CDI 扩展来说是一个大词(可扩展是 CDI 概念的一部分)。如果你想避免依赖,就使用这两个类(ViewScopedExtensionViewScopedContext
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    相关资源
    最近更新 更多