【问题标题】:application scoped bean's view is not updated应用程序范围 bean 的视图未更新
【发布时间】:2012-10-25 12:57:19
【问题描述】:

我在应用程序范围的 bean 中有一个变量。用户可以通过方法调用触发此变量的更新。现在的问题是用户在刷新 jsf 页面后没有得到这个变量的更新视图。如果已经测试了变量是否正确更新并且是正确的,那么更新方法工作正常。应用程序范围 bean 中的变量是否声明为 final 或者这里有什么问题?

【问题讨论】:

  • 显然不是同一个实例。您需要运行调试器或至少显示 SSCCE,以便我们查看并指出您的错误。
  • 是的,你是对的。我认为应用程序范围的 bean 只实例化一次。因此,如果不是这种情况,只有一个实例的唯一方法是在方法签名中传递它?在这种情况下,我想我更喜欢 Singleton Bean
  • 显然您使用了错误的注释。我发布了一个答案。

标签: jsf jakarta-ee jsf-2


【解决方案1】:

如果您使用了错误的注释组合,就会发生这种情况。例如

import javax.enterprise.context.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean
@ApplicationScoped
public class App {}

这里,范围注解来自 CDI,bean 管理注解来自 JSF。 JSF 不识别 CDI 范围注释,因此默认为 @NoneScoped。 IE。 bean 在每次 EL #{app} 评估时重建。这解释了您所看到的症状。

您还需要将范围注释修复为来自 JSF。

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean
@ApplicationScoped
public class App {}

CDI 范围注解只能与 CDI bean 管理注解@Named 结合使用。

【讨论】:

  • 嗯,不,我使用了正确的导入(都来自 javax.faces),并且我在 EJB 中使用 @Inject 注入了应用程序范围的 bean...
  • 真的很奇怪..我做了一些调试:第一次请求jsf页面时创建了一个bean实例。第二个实例是在创建使用应用程序范围 bean 的 EJB 时创建的。在此之后,每当创建新的 EJB 实例时,都会使用应用程序范围 bean 的相同(第二个)实例。但是用户总是只能看到首先创建的应用程序范围的 bean,因此没有视图更新......
  • 您不能使用 @Inject 注入 JSF 托管 bean。将其替换为 CDI 托管 bean。
  • 我不太明白。实例化 bean 的正确方法是什么?
  • 是否可以将应用程序范围的 jsf 托管 bean 注入到 EJB 中?我在教程/网络搜索中的任何地方都找不到示例...
猜你喜欢
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
相关资源
最近更新 更多