Как определить конструктор сеансового компонента EJB3

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

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

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

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

Спасибо


person Pierre Duplouy    schedule 27.09.2010    source источник


Ответы (1)


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

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

person Pierre Duplouy    schedule 27.09.2010