Ответ 1
Сделайте это в bean @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
определенно будет подходящим местом, поскольку вложенные зависимости не будут доступны внутри обычного конструктора. Более того, при использовании структуры управления bean, которая использует прокси, например CDI @Named
, конструктор может или не может быть вызван так, как вы ожидаете. Его можно вызвать несколько раз во время проверки класса, создания прокси и/или создания прокси.
По крайней мере, не выполнить работу по взаимодействию с БД в геттере, если она не будет ленивой загрузки, и вы действительно ничего не можете сделать. А именно, он будет вызываться во время каждого раунда итераций. Вызов метода обслуживания во время каждого раунда итерации является простым неэффективным и может закончиться "странными" побочными эффектами во время презентации и обратной передачи, такими как старые значения из БД, которые все еще остаются в модели вместо новых представленных значений.
Если вы полагаетесь на параметры запроса GET, используйте вместо этого <f:viewParam>
и <f:viewAction>
. Если вы хотите сохранить модель (свойство items
) через обратные копии на одном и том же представлении (например, таблицу/диалог CRUD), затем сделайте bean @ViewScoped
.