我的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吗? 请建议。感谢。
答案 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
,则必须添加一项检查。