如何在页面加载时实例化一个辅助bean

时间:2015-06-09 07:39:28

标签: jsf jsf-2 managed-bean myfaces

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

我想知道我能做些什么来使PostConstruct工作?我还缺少其他选择吗?

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

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

有更优雅的方法吗?

2 个答案:

答案 0 :(得分:2)

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

在您的视图中,您可以将其添加到页面中。

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

https://stackoverflow.com/a/14004230/4706826

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

答案 1 :(得分:-2)

将@PostConstruct注释方法放在辅助bean中。这个注释告诉bean每次调用它的构造函数时都要执行带注释的方法。

示例:

@ManagedBean
@ViewScoped
public class MyManagedBean{

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