【问题标题】:Injecting a view scoped bean into another view scoped bean将视图范围 bean 注入另一个视图范围 bean
【发布时间】:2013-11-30 11:09:19
【问题描述】:

只要用户与同一个视图交互(或直到它被导航到不同的视图),视图范围的 bean 就会保持活动状态。

假设一个视图范围的托管 bean 像这样注入另一个视图范围的 bean,

@ManagedBean
@ViewScoped
public final class SharableManagedBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @EJB
    private SharableBean sharableService;

    //...Do something.
}

@ManagedBean
@ViewScoped
public final class TestManagedBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    @EJB
    private TestBean testBean;

    @ManagedProperty(value="#{sharableManagedBean}")
    private SharableManagedBean sharableManagedBean ;

    //... Do something with the injected bean.
}

在这种情况下,SharableManagedBean 是否需要具有视图范围的 bean?

如果它是请求范围的 bean (SharableManagedBean),会发生什么?是否只初始化一次,当TestManagedBean进入画面并被销毁,当TestManagedBean被销毁?

【问题讨论】:

    标签: jsf managed-bean jsf-2.2


    【解决方案1】:

    即使在技术上可以做到这一点(JSF 允许您注入相同或更广泛范围的 bean)我不认为使用 @ViewScoped bean 这样做有什么意义。从我的角度来看,一个设计良好的 JSF Web 应用程序应该有一个 @ViewScoped bean 绑定到每个特定视图。那么,如何解决你的问题呢?你可以通过两种方式做到这一点:

    1. 如果 SharableManagedBean 是一个实用 bean,其中包含与 JSF 无关的静态方法,只需将此类定义为 abstract 并在每次需要时静态调用其方法。
    2. 如果SharableManagedBean 本身必须是访问FacesContext 的托管bean 并且具有与所有视图bean 共享的公共代码,则只需创建一个abstract 类并让您的@ViewScoped bean 扩展它。

    对于您的最后一个问题(SharableManagedBean 是 @RequestScoped),JSF 不允许您这样做。由于尝试注入范围更窄的托管 bean,您会遇到异常。

    根据Oracle docs:

    关于托管 bean 相互引用的另一个重要点是,托管 bean 只能引用其他 bean,前提是它们的范围相等或比调用对象具有更长的生命周期。

    更新

    如果使用 CDI,也可以使用代理模式将 @RequestScoped bean 注入到 @ViewScoped 中。有it a look。

    【讨论】:

    • 有道理。谢谢 :)。 (我今天没有选票。明天会做对的。)
    • 当您通过 CDI 管理 bean 时,将请求范围的 bean 注入一个范围为 one 的视图中。您只需要记住,这实际上会注入一个代理,它会在方法调用中为您提供 current 实例,因此在构造后和后续表单提交期间它不一定是相同的实例(因此,您需要在 postconstruct 中手动复制必要的属性(如果有)
    • 其实不知道。我不使用 CDI,所以我需要看看 ;-)
    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2012-08-28
    • 2016-11-13
    相关资源
    最近更新 更多