Почему я не могу внедрить 2 EJB в 2 разных управляемых bean-компонента, которые внедряют друг друга? - PullRequest
2 голосов
/ 11 февраля 2011

ContactsBean

   @Named(value = "contactsBean")
@SessionScoped
public class ContactsBean implements Serializable {

    @EJB
    ContactsFacade contactsEJB;
    private List<Contacts> contacts = new ArrayList<Contacts>();
    @Inject
    DetailsBean detailsBean;

Подробности Боб

    @Named(value = "detailsBean")
@RequestScoped
public class DetailsBean {

    @EJB
    ContactsFacade contactsEJB;
    private Contacts detailsContact = new Contacts();

Я не могу этого сделать. Всякий раз, когда я вызываю EJB-компонент, он вызывает исключение EJB, и это.

Нарушено ограничение (я) проверки бина во время выполнения автоматического бина Проверка по обратному вызову Событие: 'prePersist'

Есть идеи, ребята? Спасибо

**ОБНОВИТЬ**

Хорошо, я обнаружил, что кажется, что использование bean-объекта requestScoped вызывает эту проблему. Почему это?

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Инъекция происходит сразу после изготовления боба.Сессионный компонент создается только один раз за сеанс.Область сеанса шире, чем область запроса.Внутри одной сессии может быть несколько запросов.Инжектор не будет знать, какой запрос имеет объем, который он должен внедрить, когда в данный момент существует несколько запросов.Может даже не быть запроса вообще.

Чтобы ввести одно в другое, акцептор должен иметь ту же или более узкую область действия, чем введенный объект.Внедрение bean-объекта сессионной области в bean-объект с ограниченной областью запроса будет просто работать.Я бы предложил вместо этого воспользоваться этим маршрутом.


Не относясь к конкретной проблеме, я бы также предложил пересмотреть подход EJB.Вы действительно должны поставить одинаковые @EJB на двух бобах, которые уже знают друг о друге?Я бы предложил удалить ContactsFacade из DetailsBean и просто позволить DetailsBean делегировать работу ContactsBean.

1 голос
/ 11 февраля 2011

ContactsBean является областью сеанса, DetailsBean является областью запроса.Вы не можете внедрить bean-объект области запроса в bean-объект сессионной области.

Аналогично, вы не можете внедрить bean-объект области действия в область приложения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...