Использование @ManagedProperty в методе prerender
У меня есть таблица данных, как показано ниже в моем HTML:
<p:dataTable var="employee"
value="#{employeeBean.employeeLazyDataModel}">
Теперь в моем бобе есть:
@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? Пожалуйста, предложите. Благодарю.
1 ответ
Конечно, это будет работать. @ManagedProperty
вводится непосредственно после создания бобов. preRenderView
слушателю события требуется уже созданный компонент перед вызовом. Так что это действительно гарантированно работает.
Однако канонический подход к инициализации состояния компонента на основе управляемых свойств является @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>
с точки зрения)
Что касается жалобы на "дорогие операции" в комментарии, просто поместите компонент в область видимости, если вы не хотите запускать его для каждого запроса, но только один раз для каждого просмотра.
@ManagedBean
@ViewScoped
public class EmployeeBean implements Serializable {
Обратите внимание, что preRenderView
Событие запускается до отображения представления (таким образом, для каждого HTTP-запроса!), поэтому вам действительно нужно сохранить @PostConstruct
Вот. В противном случае вы должны добавить проверку, если FacesContext#isPostback()
возвращается false
,