如何在页面加载时实例化支持 bean

How to instantiate a backing bean on page load

对于一个项目,我们正在将一些 java 应用程序迁移到 WebSphere 8.5。在这个过程中,我们正试图摆脱一些遗留框架。其中之一是 shale (apache attic)。唯一使用的 shale 组件是视图控制器,用于为每个页面实例化请求范围内的 jsf 托管 bean。每个 bean 都有一个在页面加载时调用的 init 方法。我想在此方法上使用@PostConstruct。我遇到的唯一问题是,当调用 bean 上的方法时,bean 会被实例化。不幸的是,bean 并不总是被调用,并且 init 方法确实在会话作用域的 bean 上填充数据。有一个链接页面和 bean 的命名约定,因此我们可以使用侦听器根据请求实例化 bean。另一个解决方案可能是将范围更改为 viewscope(在 websphere 8.5 上可能会很麻烦)。

我想知道是否可以做些什么来使 PostConstruct 工作?我还缺少其他选项吗?

编辑: 我有一个执行基本功能的 PhaseListener。它将请求的页面与相应的 bean 匹配(通过命名约定)。下面是用来实例化bean的,但是看起来有点丑。

expressionFactory.createValueExpression(elContext, "#{" + managedBeanName + "}", Object.class)

有没有更优雅的方法来做到这一点?

也许您可以尝试使用 <f:event/> ?

在您看来,您可以将其添加到页面中。

<f:event type="postAddToView" listener="#{backingBean.myInitMethod()"/>

为您提供有关事件何时执行的信息。

在支持 bean 中放置一个 @PostConstruct 注释方法。此注释告诉 bean 在每次调用其构造函数时执行注释的方法。

示例:

@ManagedBean
@ViewScoped
public class MyManagedBean{

    @PostConstruct
    public void initView() throws Exception{
        ...initialize page values, execute database queries, etc.
    }