2011-07-22 52 views
3

我希望能夠@注入一個支持RichFaces 4 ExtendedDataTable的數據模型,但它需要一個EntityManager來完成它的工作。 EntityManager的查詢當然需要知道類,我寧願不將它傳遞給方法調用(在這種情況下,方法不會被我的代碼調用);理想情況下,它將在構造函數中。用於數據模型的CDI生產者方法

事情是這樣的:

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的到我的支持豆?我也想過做一個資格賽,所以你可以這樣做

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

但似乎笨拙,也需要我的@Producer叫new() - 我認爲不會允許EntityManager而注入DataModel中。此外,我不確定您將如何要求開發者添加限定符。

或者還有更好的方法來解決這個問題,我錯過了什麼?

+2

我會去與你的直覺。設計模式和框架的應用並不是很好的設計,它們是溝通的工具。 –

回答

1

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

監製:

public class EntityManagerProducer { 

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

然後你可以@注入實體管理器。

否則,有DeltaSpike項目很有前途(從來沒有使用過它尚未)

+0

謝謝你的回覆!這已經過去了一年,我已經開始與其他項目合作,所以我無法驗證這是否能解決問題,但我懷疑是這樣。 – tdm