Ответ 1
EJB вводятся только в управляемый beans. A bean управляется, когда ему управляют некоторые контейнеры для инъекций, например, через собственный JSF @ManagedBean
, CDI @Named
и т.д. Вы даже можете ввести EJB в другой EJB. Вы не можете вводить EJB в неуправляемый класс (вы можете вручную захватить его из JNDI, но это просто уродливо).
У вас есть в основном следующие возможности:
-
В
@PostConstruct
вашего управляемого bean, постройте datamodel, посредством которого вы передаете результат в качестве аргумента (обратите внимание, что это также то, как стандартные модели данных, такие какListDataModel
).@PostConstruct public void init() { lazyUsers = new LazyUserDataModel(service.findAllUsers()); }
-
Сделайте тег
LazyUserDataModel
, в котором вы попросите пользователя предоставить результат.public abstract class LazyUserDataModel extends LazyDataModel<User> { @Override public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map filters) { List<User> users; users = findAllUsers(); this.setRowCount(users.size()); return users ; } public abstract List<User> findAllUsers(); }
так что анонимный класс болит меньше
lazyUsers = new LazyUserDataModel() { @Override public List<User> findAllUsers() { return service.findAllUsers(); } };
-
Сделайте
LazyUserDataModel
управляемый bean и добавьте его вместо этого.@Named @RequestScoped public class LazyUserDataModel extends LazyDataModel<User> { // ... }
с
@Inject private LazyUserDataModel lazyUsers;
-
Создайте полнофункциональный анонимный экземпляр, как вы поняли.
Несвязанный к конкретной проблеме, нет смысла иметь LazyDataModel
, в котором вы предоставляете записи all. Его цель состоит в том, что он предлагает вам возможность запрашивать только подмножество или записи с использованием полномочий SQL (LIMIT
, OFFSET
и друзей) на основе текущего состояния с разбивкой на страницы, чтобы вам не нужно было иметь сотни, если не тысячи записей в Java-памяти, но только десять или около того. Другими словами, если вы никогда не используете аргумент first
и/или pageSize
метода load()
, вы, скорее всего, совершенно совершенно ошибаетесь.