Почему CDI-Event создает новый экземпляр, а не использует существующий Oberserver? - PullRequest
2 голосов
/ 21 марта 2012

У меня проблема с 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, конечно, работает ... но это приведет к неправильному дизайну.

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Похоже, вам нужно создать собственную область для этого варианта использования.Ни одна из областей по умолчанию не звучит так, как будто они соответствуют вашим потребностям.Другим вариантом было бы посмотреть на MyFaces CODI и область разговора, которую они написали.

0 голосов
/ 24 марта 2012

Пожалуйста, убедитесь, что ваши наблюдатели не являются частными. И вы должны убедиться, что вы перенаправили правильно.

...