gpt4 book ai didi

jsf - 将 View 范围的 bean 注入(inject)另一个 View 范围的 bean

转载 作者:行者123 更新时间:2023-12-04 02:38:53 24 4
gpt4 key购买 nike

只要用户与同一 View 交互(或导航到不同 View 之前), View 作用域 bean 就会保持事件状态。

假设一个 View 范围的托管 bean 像这样注入(inject)到另一个 View 范围的 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 是否有必要拥有一个 View 范围的 bean?

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

最佳答案

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

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

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

根据Oracle docs :

Another important point about managed beans referencing each other is that a managed bean can only refer to other beans provide their scope is equal or has a longer lifespan than the calling object.

更新

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

关于jsf - 将 View 范围的 bean 注入(inject)另一个 View 范围的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20299489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com