【发布时间】: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在自定义框架中,则无法提供进一步帮助(至少对我而言,因为那里可能会发生很多事情)