用于数据模型的CDI生产者方法

时间:2011-07-22 17:26:05

标签: java java-ee-6 cdi

我希望能够@Inject支持RichFaces 4 ExtendedDataTable的数据模型,但它需要一个EntityManager来完成它的工作。当然,EntityManager的查询需要知道Class,而我宁愿不将它传递给方法调用(在这种情况下,我的代码不调用这些方法);理想情况下,它将在构造函数中。

这样的事情:

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);
    }

是否可以创建可用于将此DataModel注入我的支持bean的CDI @Producer?我考虑过制作一个限定符,这样你就可以做一些像

这样的事情
@Inject @JType(value = MyEntity.class) DataModel<MyEntity> dataModel;

但这看起来很笨拙,并且还需要我的@Producer来调用new() - 我认为这不允许将EntityManager注入到DataModel中。此外,我不确定您将如何要求开发人员添加限定符。

或者也许有更好的方法来解决这个问题,我错过了什么?

1 个答案:

答案 0 :(得分:1)

我使用seam3中的seam-persistence模块执行此操作。 :

制片人:

public class EntityManagerProducer {

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

然后你可以@Inject实体经理。

否则,DeltaSpike项目似乎很有希望(从未使用过)