Метод CDI-производителя для модели данных - PullRequest
3 голосов
/ 22 июля 2011

Я хотел бы иметь возможность @ Inject модели данных, поддерживающей RichFaces 4 ExtendedDataTable, но для ее работы требуется EntityManager.Конечно, запросы EntityManager должны знать класс, и я бы предпочел не передавать это в вызовы методов (в этом случае методы не вызываются моим кодом);в идеале это было бы в конструкторе.

Примерно так:

public class DataModel<T> {
    @Inject private EntityManager em;
    private Class<T> entityClass;

    public DataModel(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    //Sample method - this class will handle much more complex queries
    public T findEntity(String key) {
        return em.find(entityClass, key);
    }

Возможно ли создать CDI @Producer, который можно использовать для внедрения этой DataModel в мои компоненты поддержки?Я думал о создании Qualifier, чтобы вы могли сделать что-то вроде

@Inject @JType(value = MyEntity.class) DataModel<MyEntity> dataModel;

Но это казалось неуклюжим и потребовало бы, чтобы мой @Producer вызвал new() - что, я думаю, не позволило бы EntityManagerбыть введен в DataModel.Кроме того, я не уверен, как вы могли бы требовать, чтобы разработчик добавил квалификатор.

Или, возможно, есть лучший способ приблизиться к этому, и я что-то упускаю?

1 Ответ

1 голос
/ 01 августа 2012

Я делаю это с помощью модуля seam-persistence из seam3. :

Производитель:

public class EntityManagerProducer {

   @Produces
   @ExtensionManaged
   @ConversationScoped
   @PersistenceUnit(unitName = "yourUnitName")
   private EntityManagerFactory emf;
}

Тогда вы можете @Inject менеджера сущностей.

В противном случае, есть проект DeltaSpike , который выглядит многообещающим (еще никогда не использовал его)

...