0

我的 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 吗?请建议。谢谢。

4

1 回答 1

1

这肯定会奏效。在bean 构建后直接@ManagedProperty注入。事件监听器在被调用之前需要一个已经构建好的 bean。所以这确实可以保证工作。preRenderView

但是,基于托管属性初始化 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,只需将 bean 放在视图范围内,而在每个视图的基础上只运行一次。

@ManagedBean
@ViewScoped
public class EmployeeBean implements Serializable {

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

也可以看看:

于 2013-09-05T11:18:25.510 回答