Делайте это по бобовскому методу @PostConstruct
.
@ManagedBean
@RequestScoped
public class Bean {
private List<Item> items;
@EJB
private ItemService itemService;
@PostConstruct
public void init() {
items = itemService.list();
}
public List<Item> getItems() {
return items;
}
}
И пусть value
ссылается на свойство (не метод!).
<h:dataTable value="#{bean.items}" var="item">
В @PostConstruct
у вас есть преимущество в том, что оно выполняется после конструкция и внедрение зависимостей.Таким образом, в случае, если вы используете EJB для выполнения задачи взаимодействия с БД, @PostConstruct
определенно будет правильным местом, поскольку внедренные зависимости еще не будут доступны внутри обычного конструктора.Более того, при использовании инфраструктуры управления компонентами, в которой используются прокси-серверы, такие как CDI @Named
, конструктор может или не может быть назван так, как вы ожидаете.Он может вызываться несколько раз во время проверки класса, создания прокси и / или создания прокси.
По крайней мере, не выполняет работу взаимодействия с БД в геттере, если только он не ленивзагрузка, и вы действительно больше ничего не можете сделать.А именно, он будет вызываться во время каждого раунда итерации.Вызов метода службы во время каждого раунда итерации совершенно неэффективен и может привести к «странным» побочным эффектам во время представления и обратной передачи, таким как старые значения из БД, по-видимому, все еще сохраняющиеся в модели вместо новых представленных значений.
Если вы полагаетесь на параметры запроса GET, вместо этого используйте <f:viewParam>
и <f:viewAction>
.Если вы хотите сохранить модель (свойство items
) для постбэков в одном представлении (например, в таблице / диалоге CRUD), тогда создайте компонент @ViewScoped
.
См. Также: