【问题标题】:How to have one instance of Backing Bean per Browser tab?如何为每个浏览器选项卡创建一个 Backing Bean 实例?
【发布时间】:2020-07-27 03:13:48
【问题描述】:

我的环境:Java 7/JSF 2.1/PrimeFaces 6.1。

我的目标:多次实例化我的应用程序的某个页面,每个浏览器选项卡一个,每个具有不同的上下文。

我的问题:每次我打开第二个浏览器选项卡从相同的 url 请求但具有不同的对象 id 时,前一个被破坏,所以只有一个支持 bean 实例保持活动状态。

我怎么知道:在我的支持 bean 中,我有一个方法用 @PosConstruct 注释,另一个用 @PreDestroy 注释,所以我可以跟踪实例的生命周期。

我的backing bean注释如下:

@ViewController
public class MyBackingBeanMB extends AbstractBackingBeanMB {
    private static final long serialVersionUID = 1L;

    // many fields and methods
}

@ViewController 注解由我必须使用的应用程序框架提供。这样的注解声明为:

@Named
@Controller
@Stereotype
@ViewScoped // For me, this should do the trick, but...
@Target(value={TYPE})
@Retention(value=RUNTIME)
@Inherited
public @interface ViewController {
}

更新 1:

@Controller注解也是我使用的框架提供的,声明为:

@InterceptorBinding
@Inherited
@Target({ TYPE, METHOD })
@Retention(RUNTIME)
public @interface Controller {
}

有什么可能出错的想法吗?

TIA。

【问题讨论】:

  • 我不熟悉来自 JSF 的 @Controller 注释。 @Viewscoped 不适用于每个标签。它适用于每个 viewId 的范围,有效地导致您看到的行为。您需要来自 DeltaSpike 的 @WindowScoped 或使用 @ConversationScoped。 Stackoverflow 中有一个重复的内容。
  • @BalusC:不,不使用 Spring,它是 JSF 和一些由我必须使用的框架提供的附加服务。
  • @Kukeltje:我的错,我没有提供@Controller 的声明。刚做了。抱歉,我们与@ConversationScoped 的历史很差,所以这不是我们的选择,因为药物比死者更糟糕。还有其他想法吗?
  • @BalusC:好的,只是为了绝对确定我理解我的情况。您是在告诉我,在一个绝对标准的 JSF 应用程序中,如果我使用 @ViewScope,我应该能够毫无问题地为每个浏览器选项卡拥有一个支持 bean。是这样吗?
  • 建议:WindowScoped... 如果@Controller 在自定义框架中,则无法提供进一步帮助(至少对我而言,因为那里可能会发生很多事情)

标签: jsf jsf-2


【解决方案1】:

在互联网上进行了一番挖掘后,我找到了 Apache DeltaSpike,它提供了一种新的托管 bean 范围,WindowScoped

使用 @WindowScoped` 注释的托管 bean 可以按照我的意愿运行,为我提供所需的确切行为,并且与我必须使用的框架完全兼容。

【讨论】:

  • 挖掘互联网?为什么?两周前我评论了这个范围......!如果这对你有用,通常的做法是(出于礼貌)让建议它的人创建答案
  • 抱歉,我刚刚查看了您的 cmets 并找到了您的建议,但在我决定进一步处理此事后,您发布了它。我无意不给你应有的荣誉,但由于我承受的压力,我没有时间回到这里看看。请发布一个答案,我会接受它作为正确的答案。
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2011-02-11
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
相关资源
最近更新 更多