在prerender方法中使用@ManagedProperty

时间:2013-09-05 05:54:48

标签: jsf facelets managed-property prerenderview

我的xhtml中有一个如下所示的数据表:

<p:dataTable var="employee"
      value="#{employeeBean.employeeLazyDataModel}">

现在在我的支持bean中,我有:

@ManagedBean
@RequestScoped
public class EmployeeBean implements Serializable {

    @ManagedProperty("#{" + EmployeeLazyDataModel.MANAGEDBEAN_NAME + "}")
    private EmployeeLazyDataModel employeeLazyDataModel;

    public void preRender(ComponentSystemEvent event) throws Exception {
        employeeLazyDataModel= // make a database call
    }

  // and getters + setters

您认为我可以在preRender方法中调用managedproperty吗? 请建议。感谢。

1 个答案:

答案 0 :(得分:1)

当然这会奏效。在bean构造之后,@ManagedProperty直接注入 preRenderView事件侦听器在被调用之前需要一个已构造的bean。所以这确实有效。

但是,基于托管属性初始化bean状态的规范方法是@PostConstruct带注释的方法。因此,所以:

@ManagedBean
@RequestScoped
public class EmployeeBean implements Serializable {

    @ManagedProperty("#{" + EmployeeLazyDataModel.MANAGEDBEAN_NAME + "}")
    private EmployeeLazyDataModel employeeLazyDataModel;

    @PostConstruct
    public void init() throws Exception {
        employeeLazyDataModel= // make a database call
    }

    // ...
}

(不要忘记从视图中移除<f:event>

对于评论中的“昂贵操作”投诉,如果您不希望在每个请求的基础上运行它,只需将bean放在视图范围内,但只能在每个视图的基础上运行一次。

@ManagedBean
@ViewScoped
public class EmployeeBean implements Serializable {

请注意,在呈现视图之前会触发preRenderView事件(因此,在每个HTTP请求上都会激活!),因此您确实需要在此处保留@PostConstruct。否则,如果FacesContext#isPostback()返回false,则必须添加一项检查。

另见: