Как определить конструктор сессионного компонента EJB3 - PullRequest
0 голосов
/ 27 сентября 2010

Я создаю модуль EJB3, который пытается соблюдать определенный шаблон проектирования фасада / реализации. Мой фасад должен быть полностью свободен от EJB.

У меня есть 2 класса в этом модуле: объектный компонент и сессионный компонент, который является менеджером этого объекта. Менеджер содержит атрибут EntityManager.

У меня также есть фабрика, которая создает экземпляр моего bean-компонента менеджера, но эта фабрика не знает о реализации менеджера (поэтому не знает о EJB). Фабрика может только получить имя класса менеджера, используя файл свойств. Затем фабрика создаст экземпляр менеджера:

Class lClass = Class.forName (lClassName);
corporateActionManager = (ICorporateActionManager) lClass.newInstance();

Мой вопрос: могу ли я объявить конструктор в реализации моего менеджера, а затем внутри этого конструктора инициализировать мой EntityManager?

Обычно я просто использовал бы аннотацию @PersistenceContext над EntityManager:

@PersistenceContext(unitName = "my_persistence_unit")
private EntityManager em;

Но, очевидно, это не работает, когда класс создается напрямую.

Я пробовал что-то вроде этого:

public CorporateActionManagerImpl() {
    Context jndi;
    try {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("my_persistence_unit")
    em = emf.createEntityManager();
    } catch (NamingException e1) {
    e1.printStackTrace();
    }
} 

Но затем я получаю исключение NoInitialContextException, очевидно, мой контекст JNDI инициализирован неправильно.

Может ли кто-нибудь помочь мне здесь?

Спасибо

1 Ответ

0 голосов
/ 27 сентября 2010

В итоге я создал еще один класс "manager", который инкапсулировал бы сессионный компонент и инициализировал его в конструкторе.

Он добавляет еще один слой, но в итоге разобраться гораздо проще.

...