У меня проблема с CDI на JBoss AS 7.1.1
У меня есть два JSF-компонента, один из которых имеет CODI ViewAccessScope (Bean A), который показывает все объекты, а второй - обычный RequestScoped (Bean B). Каждый Бин получает так называемый Presenter, который заботится обо всей логике представления. Пока все хорошо.
Ведущий из Bean B отвечает за создание новой сущности (вызывающей службы ... bla ... blubb), и когда все сделано, Bean B перенаправляет на другую страницу, но теперь Bean A должен перезагрузить свой контент I представил JEE-6 Observer .
Подробно: Оба Бина (A & B) получают определенный предъявитель (который имеет обратную ссылку на jsf-бин через интерфейс). Bean-B-Presenter генерирует событие после успешного создания объекта, чтобы затем Bean-A-Presenter (наблюдатель) мог перезагрузить данные и уведомить Bean-A об изменениях.
Проблема: Я получаю как NullPointerException, когда наблюдающий Presenter (A) перезагружает свои данные, потому что ссылка на Бин A потеряна. Причина, по которой это происходит, заключается в том, что CDI, очевидно, создает новый объект Presenter (аннотированный @Named) вместо использования объекта, который связан с Bean-A.
Обходной путь: когда я использую Bean-A в качестве наблюдателя, все работает.
Мой код почти такой же, как показано в добавленной мной ссылке. Я не понимаю, почему при запуске события создается новый экземпляр.
ОБНОВЛЕНИЕ относительно комментария LightGuards:
Бины презентатора только что помечены @Named (по умолчанию это должен быть Dependent-Scope).
Я посмотрел на Документация по сварке n, и похоже, что этот прицел каким-то образом изолирует мои бобы друг от друга. Мне нужно, чтобы презентаторы были новым экземпляром, каждый раз, когда представление (jsf-bean) инициализируется (поэтому никаких синглетонов). С другой стороны, я хочу иметь возможность отправлять события между ними, а это означает, что только уже существующие экземпляры получают уведомление (не то, что создается новый экземпляр).
Я только что провел тест с докладчиками, которые были RequestScoped. Это также не работает, потому что теперь при каждом HTTP-запросе я получаю нового Presenter, хотя представление (jsf-bean), к которому он принадлежит, является ViewAccessScoped. SessionScope, конечно, работает ... но это приведет к неправильному дизайну.