Использование @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,

Смотрите также:

Другие вопросы по тегам